ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkYjYzNAotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA4IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdCBMYWJzLiBJdCBpcyBjb25zaWRlcmVkCisjICAgIGNvbmZpZGVudGlhbCBhbmQgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb24uCisjCisjICAgIFRoaXMgZG9jdW1lbnQgbWF5IG5vdCBiZSByZXByb2R1Y2VkIG9yIHRyYW5zbWl0dGVkIGluIGFueSBmb3JtLAorIyAgICBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBleHByZXNzIHdyaXR0ZW4gcGVybWlzc2lvbiBvZgorIyAgICBOZXN0IExhYnMuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBYLUxvYWRlciwgYW4gaW5pdGlhbCBwcm9ncmFtCisjICAgICAgbG9hZGVyIChJUEwpIGZvciBlbWJlZGRlZCBib2FyZHMgYmFzZWQgb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMgICAgICBPTUFQIHByb2Nlc3NvcnMuCisjCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlUm9vdAkJOj0gLgorCitQYWNrYWdlTmFtZQkJOj0geC1sb2FkZXIKKworUGFja2FnZVNlcGFyYXRvcgk6PSAKKworUGFja2FnZVZlcnNpb24JCTo9IAorUGFja2FnZVNvdXJjZURpcgk6PSAkKFBhY2thZ2VOYW1lKSQoUGFja2FnZVNlcGFyYXRvcikkKFBhY2thZ2VWZXJzaW9uKQorCitQYWNrYWdlQnVpbGRNYWtlZmlsZQk9ICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMsaW5jbHVkZS9jb25maWcubWspCisKK0NsZWFuUGF0aHMJCSs9ICQoUGFja2FnZUxpY2Vuc2VGaWxlKQorCitTT1VSQ0VESVJTICAgICAgICAgICAgICAgICAgICAgID0gJChQYWNrYWdlU291cmNlRGlyKQorJChQYWNrYWdlU291cmNlRGlyKV9SVUxFX1RBUkdFVCA9ICQoQnVpbGREaXJlY3RvcnkpL2NvbmZpZ3VyZQorCithbGw6ICQoUGFja2FnZURlZmF1bHRHb2FsKQorCisjIEdlbmVyYXRlIHRoZSBwYWNrYWdlIGxpY2Vuc2UgY29udGVudHMuCisKKyQoUGFja2FnZVNvdXJjZURpcikvUkVBRE1FOiAkKEJ1aWxkRGlyZWN0b3J5KS9zb3VyY2UKKworJChQYWNrYWdlTGljZW5zZUZpbGUpOiAkKFBhY2thZ2VTb3VyY2VEaXIpL1JFQURNRQorCSQoRWNobykgIkV4dHJhY3RpbmcgXCIkKGNhbGwgR2VuZXJhdGVCdWlsZFJvb3RFbGxpcHNlZFBhdGgsJChAKSlcIiIKKwkkKFZlcmJvc2UpJChTRUQpIC1uIC1lICcxMCwyNXAnIDwgJDwgPiAkQAorCisjIFdlIGFyZSBidWlsZGluZyB0aGlzIHBhY2thZ2UgZnJvbSB2ZXJzaW9uLWNvbnRyb2xsZXIgc291cmNlLCBzbworIyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGZvciB0aGlzIHRhcmdldCBnb2FsLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpOgorCisjIFByZXBhcmUgdGhlIHNvdXJjZXMuCisKKyQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZTogfCAkKFBhY2thZ2VTb3VyY2VEaXIpCisJJChWZXJib3NlKXRvdWNoICRACisKKyMgUGF0Y2ggdGhlIHNvdXJjZXMsIGlmIG5lY2Vzc2FyeS4KKworJChCdWlsZERpcmVjdG9yeSkvcGF0Y2g6ICQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZQorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisjIFgtTG9hZGVyIGhhcyBubyB3YXkgb2YgZXhwbGljaXRseSBzZXR0aW5nIENDLCBMRCwgT0JKQ09QWSwgZXQgYWwgYW5kCisjIGluc3RlYWQgcmVsaWVzIG9uIHRoZSB2YWx1ZSBvZiBDUk9TU19DT01QSUxFLiBDb25zZXF1ZW50bHksIHdlIGhhdmUKKyMgdG8gZW5zdXJlIHRoYXQgJ1Rvb2xCaW5EaXInIGlzIGluICdQQVRIJyBzbyB0aGF0IHRoZSBrZXJuZWwgYnVpbGQKKyMgaW5mcmFzdHJ1Y3R1cmUgY2FuIGZpbmQgJChDUk9TU19DT01QSUxFKWdjYywgJChDUk9TU19DT01QSUxFKWxkLCBldCBhbC4KKworJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlICQoQnVpbGREaXJlY3RvcnkpL2J1aWxkICQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiBQQVRIIDo9ICQoUEFUSCk6JChUb29sQmluRGlyKQorJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlICQoQnVpbGREaXJlY3RvcnkpL2J1aWxkICQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiBDUk9TU19DT01QSUxFIDo9ICQoQ0NBQ0hFKSAkKENST1NTX0NPTVBJTEUpCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCiskKEJ1aWxkRGlyZWN0b3J5KS9jb25maWd1cmU6ICQoQnVpbGREaXJlY3RvcnkpL3NvdXJjZSB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoUGFja2FnZVNvdXJjZURpcikgTz0kKENVUkRJUikvJChCdWlsZERpcmVjdG9yeSkgXAorCUlOU1RBTEw9IiQoSU5TVEFMTCkgJChJTlNUQUxMRkxBR1MpIiBcCisJJChYTG9hZGVyUHJvZHVjdGlvbkNvbmZpZykKKwkkKFZlcmJvc2UpdG91Y2ggJEAKKworIyBCdWlsZCB0aGUgc291cmNlLgorCiskKEJ1aWxkRGlyZWN0b3J5KS9idWlsZDogJChCdWlsZERpcmVjdG9yeSkvY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKFBhY2thZ2VTb3VyY2VEaXIpIE89JChDVVJESVIpLyQoQnVpbGREaXJlY3RvcnkpIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCWFsbAorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisjIFN0YWdlIHRoZSBidWlsZCB0byBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24gYXJlYS4KKyMKKyMgWC1Mb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBhIG5vdGlvbiBvZiBpbnN0YWxsaW5nLCBzbyB3ZSBoYXZlIHRvCisjIGNoZXJyeS1waWNrIHRoZSBjb21wb25lbnRzIHdlIHdhbnQgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IGFuZAorIyBjb3B5L2luc3RhbGwgdGhlbSB0byB0aGUgcmVzdWx0cyBkaXJlY3RvcnkuCisKKyQoQnVpbGREaXJlY3RvcnkpL3N0YWdlOiAkKEJ1aWxkRGlyZWN0b3J5KS9idWlsZCB8ICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljcCAtZiAkKHdpbGRjYXJkICQoY2FsbCBHZW5lcmF0ZUJ1aWxkUGF0aHMseC1sb2FkKikpICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSljcCAtZiAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLFN5c3RlbS5tYXApICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSl0b3VjaCAkQAorCisuUEhPTlk6IHN0YWdlCitzdGFnZTogJChCdWlsZERpcmVjdG9yeSkvc3RhZ2UKKworCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKEJ1aWxkRGlyZWN0b3J5KQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoUmVzdWx0RGlyZWN0b3J5KQorCitpbmNsdWRlIHBvc3QubWFrCmRpZmYgLS1naXQgYS94LWxvYWRlci52ZXJzaW9uIGIveC1sb2FkZXIudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYwOTViCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIudmVyc2lvbgpAQCAtMCwwICsxIEBACisxLjQ2X09NQVBQU1BfMDMuMDAuMDEuMDYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyLy5maWxlLWxpc3QgYi94LWxvYWRlci8uZmlsZS1saXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZDUwNjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci8uZmlsZS1saXN0CkBAIC0wLDAgKzEsMTExIEBACisuQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzUKKy4vUkVBRE1FQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9hcm1fY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzQKKy4vYm9hcmQvb21hcDE3MTBoM0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMTcxMGgzL3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MjBoNC9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9ib2FyZC9vbWFwMjQyMGg0L3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDI0MzBzZHBAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC83CisuL2JvYXJkL29tYXAyNDMwc2RwL3BsYXRmb3JtLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2JvYXJkL29tYXAyNDMwc2RwL3gtbG9hZC5sZHNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2JvYXJkL29tYXAzNDMwc2RwQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9ib2FyZC9vbWFwMzQzMHNkcC9vbWFwMzQzMHNkcC5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMzQzMHNkcC9wbGF0Zm9ybS5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9ib2FyZC9vbWFwMzQzMHNkcC94LWxvYWQubGRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2NwdUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vY3B1L2FybTExMzZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9hcm0xMTM2L01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9jb25maWcubWtAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC83CisuL2NwdS9hcm0xMTM2L2NwdS5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtMTEzNi9zdGFydC5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzL01ha2VmaWxlQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vY3B1L2FybTkyNmVqcy9jcHUuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L2FybTkyNmVqcy9zdGFydC5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9jcHUvb21hcDNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2NwdS9vbWFwMy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL2NvbmZpZy5ta0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vY3B1L29tYXAzL2NwdS5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9jcHUvb21hcDMvc3RhcnQuU0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vZHJpdmVyc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vZHJpdmVycy9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzMKKy4vZHJpdmVycy9rOWY1NjE2LmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2RyaXZlcnMvazlrMTIxNi5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9kcml2ZXJzL25zMTY1NTAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vZHJpdmVycy9vbmVuYW5kLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnMvb25lbmFuZF9yZWdzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2RyaXZlcnMvc2VyaWFsLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGVAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8zCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MuaAorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MyNDN4LmgKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L21lbS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQyMC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMworLi9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MzAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zeXNfaW5mby5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9hcmNoLWFybTkyNmVqc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanMvc2l6ZXMuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwM0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9iaXRzLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MuaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2NrczM0M3guaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2NwdS5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbWVtLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tdXguaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzNDMwLmgKKy4vaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zaXplcy5oCisuL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc3lzX2luZm8uaAorLi9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19wcm90by5oCisuL2luY2x1ZGUvYXNtL2F0b21pYy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS9wcm9jLWFybXZAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3NldHVwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3NpemVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvYXNtL3N0cmluZy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2FzbS94LWxvYWQtYXJtLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvY29tbW9uLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvY29uZmlnc0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzQKKy4vaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC80CisuL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvNgorLi9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9jb25maWcuaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9pbmNsdWRlL2xpbnV4L3R5cGVzLmhAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2luY2x1ZGUvbnMxNjU1MC5oQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMgorLi9saWJAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8yCisuL2xpYi9NYWtlZmlsZUBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzIKKy4vbGliL191ZGl2c2kzLlNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL2xpYi9fdW1vZHNpMy5TQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvYm9hcmQuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzgKKy4vbGliL2RpdjAuY0BAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKKy4vbGliL2VjYy5jQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9saWIvcHJpbnRmLmNAQC9tYWluL3gtbG9hZF90aWRfaW50X3gueC8xCisuL21rY29uZmlnQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9zY3JpcHRzQEAvbWFpbi94LWxvYWRfdGlkX2ludF94LngvMQorLi9zY3JpcHRzL21rb25lYm9vdC5zaEBAL21haW4veC1sb2FkX3RpZF9pbnRfeC54LzEKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL01ha2VmaWxlIGIveC1sb2FkZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0M2RhZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2LCBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDEwCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworVkVSU0lPTiA9IDEKK1BBVENITEVWRUwgPSA0NgorU1VCTEVWRUwgPQorRVhUUkFWRVJTSU9OID0KK2lmbmVxICIkKFNVQkxFVkVMKSIgIiIKK1hfTE9BREVSX1ZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2Vsc2UKK1hfTE9BREVSX1ZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2VuZGlmCitUSU1FU1RBTVBfRklMRSA9ICQob2JqKWluY2x1ZGUvdGltZXN0YW1wX2F1dG9nZW5lcmF0ZWQuaAorVkVSU0lPTl9GSUxFID0gJChvYmopaW5jbHVkZS92ZXJzaW9uX2F1dG9nZW5lcmF0ZWQuaAorCitIT1NUQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tIHwgXAorCXNlZCAtZSBzL2kuODYvaTM4Ni8gXAorCSAgICAtZSBzL3N1bjR1L3NwYXJjNjQvIFwKKwkgICAgLWUgcy9hcm0uKi9hcm0vIFwKKwkgICAgLWUgcy9zYTExMC9hcm0vIFwKKwkgICAgLWUgcy9wcGM2NC9wb3dlcnBjLyBcCisJICAgIC1lIHMvcHBjL3Bvd2VycGMvIFwKKwkgICAgLWUgcy9tYWNwcGMvcG93ZXJwYy9cCisJICAgIC1lIHMvc2guKi9zaC8pCisKK0hPU1RPUyA6PSAkKHNoZWxsIHVuYW1lIC1zIHwgdHIgJ1s6dXBwZXI6XScgJ1s6bG93ZXI6XScgfCBcCisJICAgIHNlZCAtZSAncy9cKGN5Z3dpblwpLiovY3lnd2luLycpCisKKyMgU2V0IHNoZWxsIHRvIGJhc2ggaWYgcG9zc2libGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gc2gKK1NIRUxMIDo9ICQoc2hlbGwgaWYgWyAteCAiJCRCQVNIIiBdOyB0aGVuIGVjaG8gJCRCQVNIOyBcCisJZWxzZSBpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuIGVjaG8gL2Jpbi9iYXNoOyBcCisJZWxzZSBlY2hvIHNoOyBmaTsgZmkpCisKK2V4cG9ydAlIT1NUQVJDSCBIT1NUT1MgU0hFTEwKKworIyBEZWFsIHdpdGggY29sbGlkaW5nIGRlZmluaXRpb25zIGZyb20gdGNzaCBldGMuCitWRU5ET1I9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQWxsb3cgZm9yIHNpbGVudCBidWlsZHMKK2lmZXEgKCwkKGZpbmRzdHJpbmcgcywkKE1BS0VGTEFHUykpKQorWEVDSE8gPSBlY2hvCitlbHNlCitYRUNITyA9IDoKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgWC1sb2FkZXIgYnVpbGQgc3VwcG9ydHMgcHJvZHVjaW5nIGEgb2JqZWN0IGZpbGVzIHRvIHRoZSBzZXBhcmF0ZSBleHRlcm5hbAorIyBkaXJlY3RvcnkuIFR3byB1c2UgY2FzZXMgYXJlIHN1cHBvcnRlZDoKKyMKKyMgMSkgQWRkIE89IHRvIHRoZSBtYWtlIGNvbW1hbmQgbGluZQorIyAnbWFrZSBPPS90bXAvYnVpbGQgYWxsJworIworIyAyKSBTZXQgZW52aXJvbmVtZW50IHZhcmlhYmxlIEJVSUxEX0RJUiB0byBwb2ludCB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbgorIyAnZXhwb3J0IEJVSUxEX0RJUj0vdG1wL2J1aWxkJworIyAnbWFrZScKKyMKKyMgVGhlIHNlY29uZCBhcHByb2FjaCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggYSBNQUtFQUxMIHNjcmlwdAorIyAnZXhwb3J0IEJVSUxEX0RJUj0vdG1wL2J1aWxkJworIyAnLi9NQUtFQUxMJworIworIyBDb21tYW5kIGxpbmUgJ089JyBzZXR0aW5nIG92ZXJyaWRlcyBCVUlMRF9ESVIgZW52aXJvbmVudCB2YXJpYWJsZS4KKyMKKyMgV2hlbiBub25lIG9mIHRoZSBhYm92ZSBtZXRob2RzIGlzIHVzZWQgdGhlIGxvY2FsIGJ1aWxkIGlzIHBlcmZvcm1lZCBhbmQKKyMgdGhlIG9iamVjdCBmaWxlcyBhcmUgcGxhY2VkIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorIworCitpZmRlZiBPCitpZmVxICgiJChvcmlnaW4gTykiLCAiY29tbWFuZCBsaW5lIikKK0JVSUxEX0RJUiA6PSAkKE8pCitlbmRpZgorZW5kaWYKKworaWZuZXEgKCQoQlVJTERfRElSKSwpCitzYXZlZC1vdXRwdXQgOj0gJChCVUlMRF9ESVIpCisKKyMgQXR0ZW1wdCB0byBjcmVhdGUgYSBvdXRwdXQgZGlyZWN0b3J5LgorJChzaGVsbCBbIC1kICR7QlVJTERfRElSfSBdIHx8IG1rZGlyIC1wICR7QlVJTERfRElSfSkKKworIyBWZXJpZnkgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCitCVUlMRF9ESVIgOj0gJChzaGVsbCBjZCAkKEJVSUxEX0RJUikgJiYgL2Jpbi9wd2QpCiskKGlmICQoQlVJTERfRElSKSwsJChlcnJvciBvdXRwdXQgZGlyZWN0b3J5ICIkKHNhdmVkLW91dHB1dCkiIGRvZXMgbm90IGV4aXN0KSkKK2VuZGlmICMgaWZuZXEgKCQoQlVJTERfRElSKSwpCisKK09CSlRSRUUJCTo9ICQoaWYgJChCVUlMRF9ESVIpLCQoQlVJTERfRElSKSwkKENVUkRJUikpCitTUkNUUkVFCQk6PSAkKENVUkRJUikKK1RPUERJUgkJOj0gJChTUkNUUkVFKQorTE5ESVIJCTo9ICQoT0JKVFJFRSkKK2V4cG9ydAlUT1BESVIgU1JDVFJFRSBPQkpUUkVFCisKK01LQ09ORklHCTo9ICQoU1JDVFJFRSkvbWtjb25maWcKK2V4cG9ydCBNS0NPTkZJRworCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQorUkVNT1RFX0JVSUxECTo9IDEKK2V4cG9ydCBSRU1PVEVfQlVJTEQKK2VuZGlmCisKKyMgJChvYmopIGFuZCAoc3JjKSBhcmUgZGVmaW5lZCBpbiBjb25maWcubWsgYnV0IGhlcmUgaW4gbWFpbiBNYWtlZmlsZQorIyB3ZSBhbHNvIG5lZWQgdGhlbSBiZWZvcmUgY29uZmlnLm1rIGlzIGluY2x1ZGVkIHdoaWNoIGlzIHRoZSBjYXNlIGZvcgorIyBzb21lIHRhcmdldHMgbGlrZSB1bmNvbmZpZywgY2xlYW4sIGNsb2JiZXIsIGRpc3RjbGVhbiwgZXRjLgoraWZuZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK29iaiA6PSAkKE9CSlRSRUUpLworc3JjIDo9ICQoU1JDVFJFRSkvCitlbHNlCitvYmogOj0KK3NyYyA6PQorZW5kaWYKK2V4cG9ydCBvYmogc3JjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgInRvb2xzIiBhcmUgbmVlZGVkIGVhcmx5LCBzbyBwdXQgdGhpcyBmaXJzdAorIyBEb24ndCBpbmNsdWRlIHN0dWZmIGFscmVhZHkgZG9uZSBpbiAkKExJQlMpCitTVUJESVJTID0gdG9vbHMKKy5QSE9OWSA6ICQoU1VCRElSUykKKworaWZlcSAoJChvYmopaW5jbHVkZS9jb25maWcubWssJCh3aWxkY2FyZCAkKG9iailpbmNsdWRlL2NvbmZpZy5taykpCisKKyMgSW5jbHVkZSBhdXRvY29uZi5tayBiZWZvcmUgY29uZmlnLm1rIHNvIHRoYXQgdGhlIGNvbmZpZyBvcHRpb25zIGFyZSBhdmFpbGFibGUKKyMgdG8gYWxsIHRvcCBsZXZlbCBidWlsZCBmaWxlcy4gIFdlIG5lZWQgdGhlIGR1bW15IGFsbDogdGFyZ2V0IHRvIHByZXZlbnQgdGhlCisjIGRlcGVuZGVuY3kgdGFyZ2V0IGluIGF1dG9jb25mLm1rLmRlcCBmcm9tIGJlaW5nIHRoZSBkZWZhdWx0LgorYWxsOgorc2luY2x1ZGUgJChvYmopaW5jbHVkZS9hdXRvY29uZi5tay5kZXAKK3NpbmNsdWRlICQob2JqKWluY2x1ZGUvYXV0b2NvbmYubWsKKworIyBsb2FkIEFSQ0gsIEJPQVJELCBhbmQgQ1BVIGNvbmZpZ3VyYXRpb24KK2luY2x1ZGUgJChvYmopaW5jbHVkZS9jb25maWcubWsKK2V4cG9ydAlBUkNIIENQVSBCT0FSRCBWRU5ET1IgU09DCisKKyMgc2V0IGRlZmF1bHQgdG8gbm90aGluZyBmb3IgbmF0aXZlIGJ1aWxkcworaWZlcSAoJChIT1NUQVJDSCksJChBUkNIKSkKK0NST1NTX0NPTVBJTEUgPz0KK2VuZGlmCisKKyMgbG9hZCBvdGhlciBjb25maWd1cmF0aW9uCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBYLUxvYWQgb2JqZWN0cy4uLi5vcmRlciBpcyBpbXBvcnRhbnQgKGkuZS4gc3RhcnQgbXVzdCBiZSBmaXJzdCkKKworT0JKUyAgPSAkKENQVURJUikvc3RhcnQubworCitPQkpTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKE9CSlMpKQorCitMSUJTICs9ICQoc2hlbGwgaWYgWyAtZiBib2FyZC8kKFZFTkRPUikvY29tbW9uL01ha2VmaWxlIF07IHRoZW4gZWNobyBcCisJImJvYXJkLyQoVkVORE9SKS9jb21tb24vbGliJChWRU5ET1IpLmEiOyBmaSkKK0xJQlMgKz0gJChDUFVESVIpL2xpYiQoQ1BVKS5hCitMSUJTICs9IGxpYi9saWIkKEFSQ0gpLmEKK0xJQlMgKz0gY29tbW9uL2xpYmNvbW1vbi5hCitMSUJTICs9IGZzL2ZhdC9saWJmYXQuYQorTElCUyArPSBkaXNrL2xpYmRpc2suYQorTElCUyArPSBkcml2ZXJzL210ZC9uYW5kL2xpYm5hbmQuYQorTElCUyArPSBkcml2ZXJzL210ZC9vbmVuYW5kL2xpYm9uZW5hbmQuYQorTElCUyArPSBkcml2ZXJzL3J0Yy9saWJydGMuYQorTElCUyArPSBkcml2ZXJzL3NlcmlhbC9saWJzZXJpYWwuYQorTElCUyArPSBkcml2ZXJzL3VzYi9saWJ1c2IuYQorCitMSUJTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKExJQlMpKQorLlBIT05ZIDogJChMSUJTKSAkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkKKworTElCQk9BUkQgPSBib2FyZC8kKEJPQVJERElSKS9saWIkKEJPQVJEKS5hCitMSUJCT0FSRCA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChMSUJCT0FSRCkpCisKKyMgQWRkIEdDQyBsaWIKK1BMQVRGT1JNX0xJQkdDQyA9IC1MICQoc2hlbGwgZGlybmFtZSBgJChDQykgJChDRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lYCkgLWxnY2MKK1BMQVRGT1JNX0xJQlMgKz0gJChQTEFURk9STV9MSUJHQ0MpCitleHBvcnQgUExBVEZPUk1fTElCUworCitfX09CSlMgOj0gJChzdWJzdCAkKG9iaiksLCQoT0JKUykpCitfX0xJQlMgOj0gJChzdWJzdCAkKG9iaiksLCQoTElCUykpICQoc3Vic3QgJChvYmopLCwkKExJQkJPQVJEKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEFsd2F5cyBhcHBlbmQgQUxMIHNvIHRoYXQgYXJjaCBjb25maWcubWsncyBjYW4gYWRkIGN1c3RvbSBvbmVzCitBTEwgKz0gJChvYmopeC1sb2FkLnNyZWMgJChvYmopeC1sb2FkLmJpbiAkKG9iail4LWxvYWQuYmluLmlmdCAkKG9iailTeXN0ZW0ubWFwCisKK2FsbDoJCSQoQUxMKQorCiskKG9iail4LWxvYWQuaGV4OgkkKG9iail4LWxvYWQKKwkJJChPQkpDT1BZKSAke09CSkNGTEFHU30gLU8gaWhleCAkPCAkQAorCiskKG9iail4LWxvYWQuc3JlYzoJJChvYmopeC1sb2FkCisJCSQoT0JKQ09QWSkgLU8gc3JlYyAkPCAkQAorCiskKG9iail4LWxvYWQuYmluOgkkKG9iail4LWxvYWQKKwkJJChPQkpDT1BZKSAke09CSkNGTEFHU30gLU8gYmluYXJ5ICQ8ICRACisKKyQob2JqKXgtbG9hZC5iaW4uaWZ0OgkkKG9iail4LWxvYWQuYmluCisJCSQob2JqKXRvb2xzL3NpZ25HUCAkPAorCiskKG9iail4LWxvYWQuZGlzOgkkKG9iail4LWxvYWQKKwkJJChPQkpEVU1QKSAtZCAkPCA+ICRACisKK0dFTl9YTE9BRCA9IFwKKwkJVU5ERUZfU1lNPWAkKE9CSkRVTVApIC14ICQoTElCQk9BUkQpICQoTElCUykgfCBcCisJCXNlZCAgLW4gLWUgJ3MvLipcKCQoU1lNX1BSRUZJWClfX3VfYm9vdF9jbWRfLipcKS8tdVwxL3AnfHNvcnR8dW5pcWA7XAorCQljZCAkKExORElSKSAmJiAkKExEKSAkKExERkxBR1MpICQkVU5ERUZfU1lNICQoX19PQkpTKSBcCisJCQktLXN0YXJ0LWdyb3VwICQoX19MSUJTKSAtLWVuZC1ncm91cCAkKFBMQVRGT1JNX0xJQlMpIFwKKwkJCS1NYXAgeC1sb2FkLm1hcCAtbyB4LWxvYWQJCiskKG9iail4LWxvYWQ6CWRlcGVuZCAkKFNVQkRJUlMpICQoT0JKUykgJChMSUJCT0FSRCkgJChMSUJTKSAkKExEU0NSSVBUKSAkKG9iail4LWxvYWQubGRzCisJCSQoR0VOX1hMT0FEKQorCiskKE9CSlMpOglkZXBlbmQKKwkJJChNQUtFKSAtQyAkKENQVURJUikgJChpZiAkKFJFTU9URV9CVUlMRCksJEAsJChub3RkaXIgJEApKQorCiskKExJQlMpOglkZXBlbmQgJChTVUJESVJTKQorCQkkKE1BS0UpIC1DICQoZGlyICQoc3Vic3QgJChvYmopLCwkQCkpCisKKyQoTElCQk9BUkQpOglkZXBlbmQgJChMSUJTKQorCQkkKE1BS0UpIC1DICQoZGlyICQoc3Vic3QgJChvYmopLCwkQCkpCisKKyQoU1VCRElSUyk6CWRlcGVuZAorCQkkKE1BS0UpIC1DICRAIGFsbAorCiskKExEU0NSSVBUKToJZGVwZW5kCisJCSQoTUFLRSkgLUMgJChkaXIgJEApICQobm90ZGlyICRAKQorCiskKG9iail4LWxvYWQubGRzOiAkKExEU0NSSVBUKQorCQkkKENQUCkgJChDUFBGTEFHUykgJChMRFBQRkxBR1MpIC1hbnNpIC1EX19BU1NFTUJMWV9fIC1QIC0gPCReID4kQAorCiskKG9iailvbmVib290OgkkKG9iail4LWxvYWQuYmluCisJCXNjcmlwdHMvbWtvbmVib290LnNoCiskKFZFUlNJT05fRklMRSk6CisJCUAoIHByaW50ZiAnI2RlZmluZSBYX0xPQURFUl9WRVJTSU9OICJUZXhhcyBJbnN0cnVtZW50cyBYLUxvYWRlciAlcyVzIlxuJyAiJChYX0xPQURFUl9WRVJTSU9OKSIgXAorCQkgJyQoc2hlbGwgJChUT1BESVIpL3Rvb2xzL3NldGxvY2FsdmVyc2lvbiAkKFRPUERJUikpJyApID4gJEAudG1wCisJCUBjbXAgLXMgJEAgJEAudG1wICYmIHJtIC1mICRALnRtcCB8fCBtdiAtZiAkQC50bXAgJEAKKworJChUSU1FU1RBTVBfRklMRSk6CisJCUBMQ19BTEw9QyBkYXRlICsnI2RlZmluZSBYX0xPQURFUl9EQVRFICIlYiAlZCAlQyV5IicgPiAkQAorCQlATENfQUxMPUMgZGF0ZSArJyNkZWZpbmUgWF9MT0FERVJfVElNRSAiJVQiJyA+PiAkQAorCisjIEV4cGxpY2l0bHkgbWFrZSBfZGVwZW5kIGluIHN1YmRpcnMgY29udGFpbmluZyBtdWx0aXBsZSB0YXJnZXRzIHRvIHByZXZlbnQKKyMgcGFyYWxsZWwgc3ViLW1ha2VzIGNyZWF0aW5nIC5kZXBlbmQgZmlsZXMgc2ltdWx0YW5lb3VzbHkuCitkZXBlbmQgZGVwOgkkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkKKwkJZm9yIGRpciBpbiAkKFNVQkRJUlMpICQoQ1BVRElSKSAkKGRpciAkKExEU0NSSVBUKSkgOyBkbyBcCisJCQkkKE1BS0UpIC1DICQkZGlyIF9kZXBlbmQgOyBkb25lCisKK1RBR19TVUJESVJTID0gJChTVUJESVJTKQorVEFHX1NVQkRJUlMgKz0gJChkaXIgJChfX0xJQlMpKQorVEFHX1NVQkRJUlMgKz0gaW5jbHVkZQorCit0YWdzIGN0YWdzOgorCQljdGFncyAtdyAtbyAkKG9iailjdGFncyBgZmluZCAkKFRBR19TVUJESVJTKSBcCisJCQkJCQktbmFtZSAnKi5bY2hTXScgLXByaW50YAorCitldGFnczoKKwkJZXRhZ3MgLWEgLW8gJChvYmopZXRhZ3MgYGZpbmQgJChUQUdfU1VCRElSUykgXAorCQkJCQkJLW5hbWUgJyouW2NoU10nIC1wcmludGAKK2NzY29wZToKKwkJZmluZCAkKFRBR19TVUJESVJTKSAtbmFtZSAnKi5bY2hTXScgLXByaW50ID4gY3Njb3BlLmZpbGVzCisJCWNzY29wZSAtYiAtcSAtaworCitTWVNURU1fTUFQID0gXAorCQkkKE5NKSAkMSB8IFwKKwkJZ3JlcCAtdiAnXChjb21waWxlZFwpXHxcKFwubyQkXClcfFwoIFthVXddIFwpXHxcKFwuXC5uZyQkXClcfFwoTEFTSFtSTF1ESVwpJyB8IFwKKwkJTENfQUxMPUMgc29ydAorJChvYmopU3lzdGVtLm1hcDoJJChvYmopeC1sb2FkCisJCUAkKGNhbGwgU1lTVEVNX01BUCwkPCkgPiAkKG9iailTeXN0ZW0ubWFwCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitlbHNlCSMgIWNvbmZpZy5taworYWxsICQob2JqKXgtbG9hZC5oZXggJChvYmopeC1sb2FkLnNyZWMgJChvYmopeC1sb2FkLmJpbiBcCiskKG9iail4LWxvYWQuZGlzICQob2JqKXgtbG9hZCBcCiskKG9iailvbmVib290IFwKKyQoZmlsdGVyLW91dCB0b29scywkKFNVQkRJUlMpKSAkKFRJTUVTVEFNUF9GSUxFKSAkKFZFUlNJT05fRklMRSkgXAorZGVwZW5kIGRlcCB0YWdzIGN0YWdzIGV0YWdzIGNzY29wZSAkKG9iailTeXN0ZW0ubWFwOgorCUBlY2hvICJTeXN0ZW0gbm90IGNvbmZpZ3VyZWQgLSBzZWUgUkVBRE1FIiA+JjIKKwlAIGV4aXQgMQorCit0b29sczoKKwkkKE1BS0UpIC1DIHRvb2xzCit0b29scy1hbGw6CisJJChNQUtFKSAtQyB0b29scyBIT1NUX1RPT0xTX0FMTD15CitlbmRpZgkjIGNvbmZpZy5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3VuY29uZmlnOgorCUBybSAtZiAkKG9iailpbmNsdWRlL2NvbmZpZy5oICQob2JqKWluY2x1ZGUvY29uZmlnLm1rCisKKyVfY29uZmlnOjoJdW5jb25maWcKKwlAJChNS0NPTkZJRykgLUEgJChAOl9jb25maWc9KQorCisjCisjIEZ1bmN0aW9ucyB0byBnZW5lcmF0ZSBjb21tb24gYm9hcmQgZGlyZWN0b3J5IG5hbWVzCisjCitsY25hbWUJPSAkKHNoZWxsIGVjaG8gJCgxKSB8IHNlZCAtZSAncy9cKC4qXClfY29uZmlnL1xMXDEvJykKK3VjbmFtZQk9ICQoc2hlbGwgZWNobyAkKDEpIHwgc2VkIC1lICdzL1woLipcKV9jb25maWcvXFVcMS8nKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFSTQorIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgT01BUDEgKEFSTTkyeFQpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworb21hcDE3MTBoM19jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm05MjZlanMgb21hcDE3MTBoMworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBPTUFQMiAoQVJNMTEzNikgU3lzdGVtcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitvbWFwMjQyMGg0X2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIGFybTExMzYgb21hcDI0MjBoNAorCitvbWFwMjQzMHNkcF9jb25maWcgOiAgICB1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBhcm0xMTM2IG9tYXAyNDMwc2RwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIE9NQVAzIChBUk0tQ29ydGV4QTgpIFN5c3RlbXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK29tYXAzNDMwc2RwX2NvbmZpZyA6ICAgIHVuY29uZmlnCisJQCQoTUtDT05GSUcpICQoQDpfY29uZmlnPSkgYXJtIG9tYXAzIG9tYXAzNDMwc2RwCisKK29tYXAzNDMwbGFicmFkb3JfY29uZmlnIDogICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgb21hcDM0MzBsYWJyYWRvcgorCitvbWFwM2V2bV9jb25maWcgOgl1bmNvbmZpZworCUAkKE1LQ09ORklHKSAkKEA6X2NvbmZpZz0pIGFybSBvbWFwMyBvbWFwM2V2bQorCithbTM1MTdldm1fY29uZmlnIDogICAgICAgdW5jb25maWcKKwlAJChNS0NPTkZJRykgJChAOl9jb25maWc9KSBhcm0gb21hcDMgYW0zNTE3ZXZtCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NsZWFuOgorCUBybSAtZiAkKG9iail0b29scy9zaWduR1AKKwlAcm0gLWYgJChUSU1FU1RBTVBfRklMRSkgJChWRVJTSU9OX0ZJTEUpCisJQGZpbmQgJChPQkpUUkVFKSAtdHlwZSBmIFwKKwkJXCggLW5hbWUgJ2NvcmUnIC1vIC1uYW1lICcqLmJhaycgLW8gLW5hbWUgJyp+JyBcCisJCS1vIC1uYW1lICcqLm8nCS1vIC1uYW1lICcqLmEnIC1vIC1uYW1lICcqLmV4ZScJXCkgLXByaW50IFwKKwkJfCB4YXJncyBybSAtZgorCitjbG9iYmVyOgljbGVhbgorCUBmaW5kICQoT0JKVFJFRSkgLXR5cGUgZiBcKCAtbmFtZSAuZGVwZW5kIFwKKwkJLW8gLW5hbWUgJyouc3JlYycgLW8gLW5hbWUgJyouYmluJyAtbyAtbmFtZSAnKi5iaW4uaWZ0JyBcKSBcCisJCS1wcmludDAgXAorCQl8IHhhcmdzIC0wIHJtIC1mCisJQHJtIC1mICQoT0JKUykgJChvYmopKi5iYWsgJChvYmopY3RhZ3MgJChvYmopZXRhZ3MgJChvYmopVEFHUyBcCisJCSQob2JqKWNzY29wZS4qICQob2JqKSouKn4KKwlAcm0gLWYgJChvYmopeC1sb2FkICQob2JqKXgtbG9hZC5tYXAgJChvYmopeC1sb2FkLmhleCAkKEFMTCkKKwlAcm0gLWYgJChvYmopaW5jbHVkZS9hc20vcHJvYyAkKG9iailpbmNsdWRlL2FzbS9hcmNoICQob2JqKWluY2x1ZGUvYXNtCisKK2lmZXEgKCQoT0JKVFJFRSksJChTUkNUUkVFKSkKK21ycHJvcGVyIFwKK2Rpc3RjbGVhbjoJY2xvYmJlciB1bmNvbmZpZworZWxzZQorbXJwcm9wZXIgXAorZGlzdGNsZWFuOgljbG9iYmVyIHVuY29uZmlnCisJcm0gLXJmICQob2JqKSoKK2VuZGlmCisKK2JhY2t1cDoKKwlGPWBiYXNlbmFtZSAkKFRPUERJUilgIDsgY2QgLi4gOyBcCisJZ3RhciAtLWZvcmNlLWxvY2FsIC16Y3ZmIGBMQ19BTEw9QyBkYXRlICIrJCRGLSVZLSVtLSVkLSVULnRhci5neiJgICQkRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9SRUFETUUgYi94LWxvYWRlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyNjYyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL1JFQURNRQpAQCAtMCwwICsxLDE1MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworIworIyBTb21lIGN1dC9wYXN0ZSBmcm9tIFUtQm9vdCBSRUFETUUKKyMgKEMpIENvcHlyaWdodCAyMDAwIC0gMjAwNAorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1N1bW1hcnk6Cis9PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGNvZGUgZm9yIFgtTG9hZGVyLCBhbiBpbml0aWFsIHByb2dyYW0KK2xvYWRlciBmb3IgRW1iZWRkZWQgYm9hcmRzIGJhc2VkIG9uIE9NQVAgcHJvY2Vzc29ycy4gWC1Mb2FkZXIgY2FuIGJlCitzaWduZWQgYnkgVGV4YXMgSW5zdHJ1bWVudHMgSUZUIGFuZCBpbnN0YWxsZWQgdG8gTmFuZCBmbGFzaCB0byBhY2hpZXZlCitOYW5kIGJvb3RpbmcuCisKKworU3RhdHVzOgorPT09PT09PQorCitUaGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgSDMgYm9hcmQgKE9NQVAxNzEwKSBoYXMgYmVlbiBpbXBsZW1lbnRlZAorYW5kIHRlc3RlZC4gKE1heSAyMDA0KQorVGhlIHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEg0IGJvYXJkIChPTUFQMjQyMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChOb3YgMjAwNCkKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyAyNDMwU0RQIGJvYXJkIChPTUFQMjQzMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChKdWwgMjAwNikKK1RoZSBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyAzNDMwU0RQIGJvYXJkIChPTUFQMzQzMCkgaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2FuZCB0ZXN0ZWQuIChEZWMgMjAwNikKKworCitTdXBwb3J0IGZvciBvdGhlciBPTUFQIGJvYXJkcyBjYW4gYmUgYWRkZWQuCisgCisgIAorRGlyZWN0b3J5IEhpZXJhcmNoeToKKz09PT09PT09PT09PT09PT09PT09CisKKy0gYm9hcmQJCUJvYXJkIGRlcGVuZGVudCBmaWxlcworLSBjcHUJCUNQVSBzcGVjaWZpYyBmaWxlcworLSBkcml2ZXJzCUNvbW1vbmx5IHVzZWQgZGV2aWNlIGRyaXZlcnMKKy0gbGliCQlMaWJyYXJpZXMKKyAKKy0gY3B1L2FybTkyNmVqcyBGaWxlcyBzcGVjaWZpYyB0byBBUk0gOTI2IENQVXMKKy0gY3B1L2FybTExMzYgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIDExMzYgQ1BVcworLSBjcHUvb21hcDMgRmlsZXMgc3BlY2lmaWMgdG8gQVJNIENvcnRleEE4IENQVQorCisgCistIGJvYXJkL29tYXAxNzEwaDMKKwkJRmlsZXMgc3BlY2lmaWMgdG8gT01BUCAxNzEwIEgzIGJvYXJkcworLSBib2FyZC9vbWFwMjQyMGg0CisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMjQyMCBINCBib2FyZHMKKy0gYm9hcmQvb21hcDI0MzBzZHAKKwkJRmlsZXMgc3BlY2lmaWMgdG8gT01BUCAyNDMwIDI0MzBzZHAgYm9hcmRzCistIGJvYXJkL29tYXAzNDMwc2RwCisJCUZpbGVzIHNwZWNpZmljIHRvIE9NQVAgMzQyMHNkcCBib2FyZHMKKworIAorU29mdHdhcmUgQ29uZmlndXJhdGlvbjoKKz09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbmZpZ3VyYXRpb24gaXMgdXN1YWxseSBkb25lIHVzaW5nIEMgcHJlcHJvY2Vzc29yIGRlZmluZXMuIENvbmZpZ3VyYXRpb24KK2RlcGVuZHMgb24gdGhlIGNvbWJpbmF0aW9uIG9mIGJvYXJkIGFuZCBDUFUgdHlwZTsgYWxsIHN1Y2ggaW5mb3JtYXRpb24gaXMKK2tlcHQgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUgImluY2x1ZGUvY29uZmlncy88Ym9hcmRfbmFtZT4uaCIuCisKK0V4YW1wbGU6IEZvciBhIEgzIG1vZHVsZSwgYWxsIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgYXJlIGluCisiaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaCIuCisgIAorRm9yIGFsbCBzdXBwb3J0ZWQgYm9hcmRzIHRoZXJlIGFyZSByZWFkeS10by11c2UgZGVmYXVsdAorY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlOyBqdXN0IHR5cGUgIm1ha2UgPGJvYXJkX25hbWU+X2NvbmZpZyIuCisKK0V4YW1wbGU6IEZvciBhIEgzIG1vZHVsZSB0eXBlOgorCisJY2QgeC1sb2FkCisJbWFrZSBvbWFwMTcxMGgzX2NvbmZpZworCitBZnRlciBhIGJvYXJkIGhhcyBiZWVuIGNvbmZpZ3VyZWQsIHR5cGUgIm1ha2UiIHRvIGJ1aWxkIGl0IHN1cHBvc2luZyB0aGUKK25lZWRlZCBjcm9zcyB0b29scyBhcmUgaW4geW91ciBwYXRoLgorCisgCitJbWFnZSBGb3JtYXQ6Cis9PT09PT09PT09PT09CisKK1gtTG9hZGVyIGV4cGVjdHMgT1MgYm9vdCBsb2FkZXIgKGUuZy4gVS1Cb290KSBpbiBOYW5kIGZsYXNoIHVzaW5nCitKRkZTMiBzdHlsZSBFQ0MuIAorCisKK1ByZXBhcmUgQm9vdGluZyBOYW5kIEZsYXNoOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIHlvdSBoYXZlIGJ1aWx0IHgtbG9hZC5iaW4gZm9yIHlvdXIgYm9hcmQsIHlvdSBuZWVkIHRvIGRvIHRoZQorZm9sbG93aW5ncyB0byBnZXQgaXQgaW50byBOYW5kIGZsYXNoOgorCisxLiBVc2UgVGV4YXMgSW5zdHJ1bWVudHMgSUZUIHRvIHNpZ24geC1sb2FkLmJpbi4gVGhpcyByZXN1bHRzIGluIGEKK3NpZ25lZCBpbWFnZSBjYWxsZWQgeC1sb2FkLmJpbi5pZnQuCisyLiBVc2UgVGV4YXMgSW5zdHJ1bWVudHMgRmxhc2hQcmVwIHRvIGdlbmVyYXRlIGEgLm91dCBmaWxlIHVzaW5nCitGbGFzaFdyaXRlck5hbmQgYW5kIHNwZWNpZnlpbmcgMCBhcyBuYW5kIHRhcmdldCBhZGRyZXNzLgorMy4gVXNlIFRleGFzIGluc3RydW1uZXRzIENvZGUgQ29tcG9zZXIgU3R1ZGlvIHRvIHJ1biB0aGUgLm91dCBmaWxlIAord2hpY2ggZmxhc2hlcyB4LWxvYWQuYmluLmlmdCB0byBOYW5kIGZsYXNoLgorCitOZXh0IHlvdSBuZWVkIHRvIGdldCB5b3VyIE9TIGJvb3QgbG9hZGVyIHRvIE5hbmQgYXQgdGhlIGFkZHJlc3MgeW91cgorWC1Mb2FkZXIgZXhwZWN0cy4gRm9yIHRoZSBIMyBleGFtcGxlLCB5b3UgY2FuIHVzZSBVLUJvb3QgdG8gZmxhc2ggVS1Cb290LgorWW91IGNhbid0IHVzZSBGbGFzaFdyaXRlck5hbmQgYmVjYXVzZSBpdCB1c2VzIFJPTSBjb2RlIEVDQyBzdHlsZS4gIAorCisKK01vcmUgSW5mb3JtYXRpb24KKz09PT09PT09PT09PT09PT0KKworT01BUDE3MTAgTkFORCBCb290aW5nIERlc2lnbiBEb2N1bWVudCBoYXMgbW9yZSBpbmZvcm1hdGlvbi4KKworSW1wbGVtZW5hdGlvbiBub3RlczoKKz09PT09PT09PT09PT09PT09PT09CitIMywgSDQgc3VwcG9ydCBOQU5EIGZsYXNoIGJvb3RpbmcKKzI0MzBzZHAgJiAzNDMwc2RwIHN1cHBvcnQgT25lTkFORCBib290aW5nCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYXJtX2NvbmZpZy5tayBiL3gtbG9hZGVyL2FybV9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkOTYyNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2FybV9jb25maWcubWsKQEAgLTAsMCArMSwyNCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitQTEFURk9STV9DUFBGTEFHUyArPSAtRENPTkZJR19BUk0gLURfX0FSTV9fCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjMjkyNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9NYWtlZmlsZQpAQCAtMCwwICsxLDQ5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwOQorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjIE1hbmlrYW5kYW4gUGlsbGFpPG1hbmkucGlsbGFpQHRpLmNvbT4KKyMgVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL01ha2VmaWxlCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gYW0zNTE3ZXZtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vYW0zNTE3ZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGJlOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9hbTM1MTdldm0uYwpAQCAtMCwwICsxLDkwOCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogTWFuaWthbmRhbiBQaWxsYWk8bWFuaS5waWxsYWlAdGkuY29tPgorICogVGhpcyBmaWxlIGlzIGNvcGllZCBmcm9tIGJvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KK3N0cnVjdCBkcGxsX3BhcmFtIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG07CisgICAgICAgIHVuc2lnbmVkIGludCBuOworICAgICAgICB1bnNpZ25lZCBpbnQgZnNlbDsKKyAgICAgICAgdW5zaWduZWQgaW50IG0yOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisjZGVmaW5lIE1BWF9TSUxfSU5ERVgJMworCisvKiBEZWZpbml0aW9ucyBmb3IgRU1JRjQgY29uZmlndXJhdGlvbiB2YWx1ZXMgKi8KKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JQCQkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JDRAkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1dSCQkweDMKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JBUwkweDgKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JDCQkweEEKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1JSRAkweDIKKyNkZWZpbmUJRU1JRjRfVElNMV9UX1dUUgkweDIKKworI2RlZmluZQlFTUlGNF9USU0yX1RfWFAJCTB4MgorI2RlZmluZQlFTUlGNF9USU0yX1RfT0RUCTB4MAorI2RlZmluZQlFTUlGNF9USU0yX1RfWFNOUgkweDFDCisjZGVmaW5lCUVNSUY0X1RJTTJfVF9YU1JECTB4QzgKKyNkZWZpbmUJRU1JRjRfVElNMl9UX1JUUAkweDEKKyNkZWZpbmUJRU1JRjRfVElNMl9UX0NLRQkweDIKKworI2RlZmluZQlFTUlGNF9USU0zX1RfVERRU0NLTUFYCTB4MAorI2RlZmluZQlFTUlGNF9USU0zX1RfUkZDCTB4MjUKKyNkZWZpbmUJRU1JRjRfVElNM19UX1JBU19NQVgJMHg3CisKKyNkZWZpbmUJRU1JRjRfUFdSX0lETEUJCTB4MgorI2RlZmluZQlFTUlGNF9QV1JfRFBEX0VOCTB4MAorI2RlZmluZQlFTUlGNF9QV1JfUE1fRU4JCTB4MAorI2RlZmluZQlFTUlGNF9QV1JfUE1fVElNCTB4MAorCisjZGVmaW5lCUVNSUY0X0lOSVRSRUZfRElTCTB4MAorI2RlZmluZQlFTUlGNF9QQVNSCQkweDAKKyNkZWZpbmUJRU1JRjRfUkVGUkVTSF9SQVRFCTB4NTBGCisKKy8qCisgKiBTRFJBTSBDb25maWcgcmVnaXN0ZXIKKyAqLworI2RlZmluZQlFTUlGNF9DRkdfU0RSQU1fVFlQCTB4MgorI2RlZmluZQlFTUlGNF9DRkdfSUJBTktfUE9TCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSX1RFUk0JMHgwCisjZGVmaW5lCUVNSUY0X0NGR19ERFIyX0REUVMJMHgxCisjZGVmaW5lCUVNSUY0X0NGR19EWU5fT0RUCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfRERSX0RJU19ETEwJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19TRFJfRFJWCTB4MAorI2RlZmluZQlFTUlGNF9DRkdfQ1dMCQkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX05BUlJPV19NRAkweDAKKyNkZWZpbmUJRU1JRjRfQ0ZHX0NMCQkweDUKKyNkZWZpbmUJRU1JRjRfQ0ZHX1JPV1NJWkUJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19JQkFOSwkJMHgzCisjZGVmaW5lCUVNSUY0X0NGR19FQkFOSwkJMHgwCisjZGVmaW5lCUVNSUY0X0NGR19QR1NJWkUJMHgyCisKKy8qCisgKiBFTUlGNCBQSFkgQ29udHJvbCAxIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBFTUlGNF9ERFIxX1JEX0xBVAkweDYKKyNkZWZpbmUJRU1JRjRfRERSMV9QV1JETl9ESVMJMHgwCisjZGVmaW5lIEVNSUY0X0REUjFfU1RSQkVOX0VYVAkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9ETExfTU9ERQkweDAKKyNkZWZpbmUgRU1JRjRfRERSMV9WVFBfRFlOCTB4MAorI2RlZmluZSBFTUlGNF9ERFIxX0xCX0NLX1NFTAkweDAKKworLyoKKyAqIEVNSUY0IFBIWSBDb250cm9sIDIgcmVnaXN0ZXIgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEVNSUY0X0REUjJfVFhfREFUQV9BTElHTgkweDAKKyNkZWZpbmUgRU1JRjRfRERSMl9SWF9ETExfQllQQVNTCTB4MAorCisvKiBGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBmcm9tIGxvd2xldmVsX2luaXQuUyAqLworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKKyNpZiAwCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworI2VuZGlmCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKiBUT0RPOiBNb3ZlIGl0IHRvIGNvbW1vbiBwbGFjZSBzbyB0aGF0IHNob3VsZCBiZSB1c2VkCisgKiBmb3IgYWxsIE9NQVAgc2VyaWVzIG9mIGRldmljZXMKKyAqLwordTMyIGlzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwLCBjcHVfZmFtaWx5ID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWNwdWlkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJaGF3a2V5ZSAgPSAoY3B1aWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwlzd2l0Y2ggKGhhd2tleWUpIHsKKwljYXNlIEhBV0tFWUVfQU0zNVhYOgorCWRlZmF1bHQ6CisJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNwdV9mYW1pbHk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkgLSByZXR1cm4gU1lTX0JPT1RbNDowXQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChTWVNCT09UX01BU0spOworICAgICAgICByZXR1cm4gbW9kZTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBnZXRfbWVtX3R5cGUodm9pZCkgLSByZXR1cm5zIHRoZSBraW5kIG9mIG1lbW9yeSBjb25uZWN0ZWQKKyAqIHRvIEdQTUMgdGhhdCB3ZSBhcmUgdHJ5aW5nIHRvIGJvb3QgZm9ybS4gVXNlcyBTWVMgQk9PVCBzZXR0aW5ncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9tZW1fdHlwZSh2b2lkKQoreworICAgICAgICB1MzIgICBtZW1fdHlwZSA9IGdldF9zeXNib290X3ZhbHVlKCk7CisgICAgICAgIHN3aXRjaCAobWVtX3R5cGUpeworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICBjYXNlIDI3OiAgICByZXR1cm4gR1BNQ19OQU5EOworCisKKworICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIAkJcmV0dXJuIE1NQ19OQU5EOworCisgICAgICAgICAgICBkZWZhdWx0OiAgICByZXR1cm4gR1BNQ19OQU5EOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ19lbWlmNF9kZHIoKSAtIEluaXQvQ29uZmlndXJlIEREUiBvbiBBTTM1MTcgRVZNIGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnX2VtaWY0X2Rkcih2b2lkKQoreworCXVuc2lnbmVkIGludCByZWd2YWw7CisKKwkvKiBTZXQgdGhlIEREUiBQSFkgcGFyYW1ldGVycyBpbiBQSFkgY3RybCByZWdpc3RlcnMgKi8KKwlyZWd2YWwgPSAoRU1JRjRfRERSMV9SRF9MQVQgfCAoRU1JRjRfRERSMV9QV1JETl9ESVMgPDwgNikgfAorCQkoRU1JRjRfRERSMV9TVFJCRU5fRVhUIDw8IDcpIHwgKEVNSUY0X0REUjFfRExMX01PREUgPDwgMTIpIHwKKwkJKEVNSUY0X0REUjFfVlRQX0RZTiA8PCAxNSkgfCAoRU1JRjRfRERSMV9MQl9DS19TRUwgPDwgMjMpKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9ERFJfUEhZQ1RMMSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDFfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfRERSMl9UWF9EQVRBX0FMSUdOIHwgKEVNSUY0X0REUjJfUlhfRExMX0JZUEFTUyA8PCAxKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfRERSX1BIWUNUTDIpOworCisJLyogUmVzZXQgdGhlIEREUiBQSFkgYW5kIHdhaXQgdGlsbCBjb21wbGV0ZWQgKi8KKwlzcjMyKEVNSUY0X0lPREZUX1RMR0MsIDEwLCAxLCAxKTsKKwkvKldhaXQgdGlsbCB0aGF0IGJpdCBjbGVhcnMqLworCXdoaWxlICgoX19yYXdfcmVhZGwoRU1JRjRfSU9ERlRfVExHQykgJiBCSVQxMCkgPT0gMHgxKTsKKwkvKlJlLXZlcmlmeSB0aGUgRERSIFBIWSBzdGF0dXMqLworCXdoaWxlICgoX19yYXdfcmVhZGwoRU1JRjRfU0RSQU1fU1RTKSAmIEJJVDIpID09IDB4MCk7CisKKwlzcjMyKEVNSUY0X0lPREZUX1RMR0MsIDAsIDEsIDEpOworCS8qIFNldCBTRFIgdGltaW5nIHJlZ2lzdGVycyAqLworCXJlZ3ZhbCA9IChFTUlGNF9USU0xX1RfV1RSIHwgKEVNSUY0X1RJTTFfVF9SUkQgPDwgMykgfAorCQkoRU1JRjRfVElNMV9UX1JDIDw8IDYpIHwgKEVNSUY0X1RJTTFfVF9SQVMgPDwgMTIpIHwKKwkJKEVNSUY0X1RJTTFfVF9XUiA8PCAxNykgfCAoRU1JRjRfVElNMV9UX1JDRCA8PCAyMSkgfAorCQkoRU1JRjRfVElNMV9UX1JQIDw8IDI1KSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMV9TSERXKTsKKworCXJlZ3ZhbCA9IChFTUlGNF9USU0yX1RfQ0tFIHwgKEVNSUY0X1RJTTJfVF9SVFAgPDwgMykgfAorCQkoRU1JRjRfVElNMl9UX1hTUkQgPDwgNikgfCAoRU1JRjRfVElNMl9UX1hTTlIgPDwgMTYpIHwKKwkJKEVNSUY0X1RJTTJfVF9PRFQgPDwgMjUpIHwgKEVNSUY0X1RJTTJfVF9YUCA8PCAyOCkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTIpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1RJTTJfU0hEVyk7CisKKwlyZWd2YWwgPSAoRU1JRjRfVElNM19UX1JBU19NQVggfCAoRU1JRjRfVElNM19UX1JGQyA8PCA0KSB8CisJCShFTUlGNF9USU0zX1RfVERRU0NLTUFYIDw8IDEzKSk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNMyk7CisJX19yYXdfd3JpdGVsKHJlZ3ZhbCwgRU1JRjRfU0RSQU1fVElNM19TSERXKTsKKworCS8qIFNldCB0aGUgUFdSIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwlyZWd2YWwgPSAoRU1JRjRfUFdSX1BNX1RJTSB8IChFTUlGNF9QV1JfUE1fRU4gPDwgOCkgfAorCQkoRU1JRjRfUFdSX0RQRF9FTiA8PCAxMCkgfCAoRU1JRjRfUFdSX0lETEUgPDwgMzApKTsKKwlfX3Jhd193cml0ZWwocmVndmFsLCBFTUlGNF9QV1JfTUdUX0NUUkwpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1BXUl9NR1RfQ1RSTF9TSERXKTsKKworCS8qIFNldCB0aGUgRERSIHJlZnJlc2ggcmF0ZSBjb250cm9sIHJlZ2lzdGVyICovCisJcmVndmFsID0gKEVNSUY0X1JFRlJFU0hfUkFURSB8IChFTUlGNF9QQVNSIDw8IDI0KSB8CisJCShFTUlGNF9JTklUUkVGX0RJUyA8PCAzMSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1JGQ1IpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX1JGQ1JfU0hEVyk7CisKKwkvKiBzZXQgdGhlIFNEUkFNIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KKwlyZWd2YWwgPSAoRU1JRjRfQ0ZHX1BHU0laRSB8IChFTUlGNF9DRkdfRUJBTksgPDwgMykgfAorCQkoRU1JRjRfQ0ZHX0lCQU5LIDw8IDQpIHwgKEVNSUY0X0NGR19ST1dTSVpFIDw8IDcpIHwKKwkJKEVNSUY0X0NGR19DTCA8PCAxMCkgfCAoRU1JRjRfQ0ZHX05BUlJPV19NRCA8PCAxNCkgfAorCQkoRU1JRjRfQ0ZHX0NXTCA8PCAxNikgfCAoRU1JRjRfQ0ZHX1NEUl9EUlYgPDwgMTgpIHwKKwkJKEVNSUY0X0NGR19ERFJfRElTX0RMTCA8PCAyMCkgfCAoRU1JRjRfQ0ZHX0RZTl9PRFQgPDwgMjEpIHwKKwkJKEVNSUY0X0NGR19ERFIyX0REUVMgPDwgMjMpIHwgKEVNSUY0X0NGR19ERFJfVEVSTSA8PCAyNCkgfAorCQkoRU1JRjRfQ0ZHX0lCQU5LX1BPUyA8PCAyNykgfCAoRU1JRjRfQ0ZHX1NEUkFNX1RZUCA8PCAyOSkpOworCV9fcmF3X3dyaXRlbChyZWd2YWwsIEVNSUY0X1NEUkFNX0NGRyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa19zcGVlZCAtIGRldGVybWluZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZAorICogIGJhc2VkIG9uIGtub3duIDMya0h6IGNsb2NrIGFuZCBncHRpbWVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X29zY19jbGtfc3BlZWQodm9pZCkKK3sKKwl1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKFBSTV9DTEtTUkNfQ1RSTCk7CisJLyogSWYgU1lTX0NMSyBpcyBiZWluZyBkaXZpZGVkIGJ5IDIsIHJlbW92ZSBmb3Igbm93ICovCisJdmFsID0gKHZhbCAmICh+QklUNykpIHwgQklUNjsKKwlfX3Jhd193cml0ZWwodmFsLCBQUk1fQ0xLU1JDX0NUUkwpOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfc3lzX2Nsa2luX3NlbCgpIC0gcmV0dXJucyB0aGUgc3lzX2Nsa2luX3NlbCBmaWVsZCB2YWx1ZSBiYXNlZCBvbgorICogICAtLSBpbnB1dCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGdldF9zeXNfY2xraW5fc2VsKHUzMiBvc2NfY2xrLCB1MzIgKnN5c19jbGtpbl9zZWwpCit7CisJaWYob3NjX2NsayA9PSBTMzhfNE0pCisJCSpzeXNfY2xraW5fc2VsPSAgNDsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzI2TSkKKwkJKnN5c19jbGtpbl9zZWwgPSAzOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTlfMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMjsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEzTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAxOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmgKKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTSwgb3IgRmxhc2ggKHVzaW5nIHRlbXAgU1JBTSBzdGFjaykuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHByY21faW5pdCh2b2lkKQoreworCXUzMiBvc2NfY2xrPTAsIHN5c19jbGtpbl9zZWw7CisJZHBsbF9wYXJhbSAqZHBsbF9wYXJhbV9wOworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlvc2NfY2xrID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChvc2NfY2xrLCAmc3lzX2Nsa2luX3NlbCk7CisKKwlzcjMyKFBSTV9DTEtTRUwsIDAsIDMsIHN5c19jbGtpbl9zZWwpOyAvKiBzZXQgaW5wdXQgY3J5c3RhbCBzcGVlZCAqLworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlLzIgKi8KKwlpZihzeXNfY2xraW5fc2VsID4gMikgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMik7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsLzI7CisJfSBlbHNlIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDEpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbDsKKwl9CisKKwkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJICovCisJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gUEVSICBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBjbGtfaW5kZXg7CisJLyogUEVSIERQTEwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJLyogc2V0IE01ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA1LCBQRVJfTTRYMik7CS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkvKiBzZXQgTTMgKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogc2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBtICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogc2V0IG4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMjAsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7LyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOwkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgZHBsbF9wYXJhbV9wLT5uKTsJLyogU2V0IE4gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsgLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvcgorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCisJLyogZW5hYmxlIHRoZSBERFJQSFkgY2xrICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1ODgpLCAxNSwgMTUsIDB4MSk7CisJLyogZW5hYmxlIHRoZSBFTUlGNCBjbGsgKi8KKwlzcjMyKChPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDU4OCksIDE0LCAxNCwgMHgxKTsKKwkvKiBFbmFibGUgdGhlIHBlcmlwaGVyYWwgY2xvY2tzICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1OUMpLCAwLCA0LCAweEYpOworCXNyMzIoKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTlDKSwgOCwgMTAsIDB4Nyk7CisKKwkvKiBicmluZyBjcGdtYWMgb3V0IG9mIHJlc2V0ICovCisJc3IzMigoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg1OTgpLCAxLCAxLCAweDEpOworCisJLyogQ29uZmlndXJlIHRoZSBFTUlGNCBmb3Igb3VyIEREUiAqLworCWNvbmZpZ19lbWlmNF9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisKKwkvKiBFbmFibGUgVUFSVDIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDE0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAxNCwgMSwgMHgxKTsKKworCS8qIEVuYWJsZSBVQVJUMiBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDExLCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOX1BFUiwgMTEsIDEsIDB4MSk7CisjZW5kaWYKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCisJLyogRW5hYmxlIE1NQzIgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI1LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNSwgMSwgMHgxKTsKKworCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMCksICAgICAgKE0wKSkgLypTRFJDX0NLRTAqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMSksICAgICAgKE0wKSkgLypTRFJDX0NLRTEqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzYqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYxKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY0Ki9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjUqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTAqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MSovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfVFhfSVJUWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUM19SVFNfU0QpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDNfQ1RTX1JDVFgpLCAgICAgIChJRU4gfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUM19SWF9JUlJYKSwgICAgICAgKElFTiB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCS8qRXhwYW5zaW9uIGNhcmQgICovXAorCU1VWF9WQUwoQ1AoTU1DMV9DTEspLCAgICAgICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypNTUMxX0NMSyovXAorCU1VWF9WQUwoQ1AoTU1DMV9DTUQpLCAgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0NNRCovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQwKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDAqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUMSksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQxKi9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDIpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUMiovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQzKSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDMqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNCksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ0Ki9cCisJTVVYX1ZBTChDUChNTUMxX0RBVDUpLCAgICAgICAgIChJRU4gIHwgUFRVIHwgRElTIHwgTTApKSAvKk1NQzFfREFUNSovXAorCU1VWF9WQUwoQ1AoTU1DMV9EQVQ2KSwgICAgICAgICAoSUVOICB8IFBUVSB8IERJUyB8IE0wKSkgLypNTUMxX0RBVDYqL1wKKwlNVVhfVkFMKENQKE1NQzFfREFUNyksICAgICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qTU1DMV9EQVQ3Ki9cCisJTVVYX1ZBTChDUChNY0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKworCS8qIFNldCB0aGUgR1BNQyBWYWxzIC4gRm9yIE5BTkQgYm9vdCBvbiAzNDMwU0RQLCBOQU5EIGlzIG1hcHBlZCBhdCBDUzAKKyAgICAgICAgICogICwgTk9SIGF0IENTMSBhbmQgTVBEQiBhdCBDUzMuIEFuZCBvbmVOQU5EIGJvb3QsIHdlIG1hcCBvbmVOQU5EIGF0IENTMC4KKwkgKiAgV2UgY29uZmlndXJlIG9ubHkgR1BNQyBDUzAgd2l0aCByZXF1aXJlZCB2YWx1ZXMuIENvbmZpZ2lyaW5nIG90aGVyIGRldmljZXMKKwkgKiAgYXQgb3RoZXIgQ1MgaW4gZG9uZSBpbiB1LWJvb3QgYW55d2F5LiBTbyB3ZSBkb24ndCBoYXZlIHRvIGJvdGhlciBkb2luZyBpdCBoZXJlLgorICAgICAgICAgKi8KKwlfX3Jhd193cml0ZWwoMCAsIEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCk7CisJZGVsYXkoMTAwMCk7CisKKwlpZiAoKGdldF9tZW1fdHlwZSgpID09IEdQTUNfTkFORCkgfHwgKGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyAgICAgICAgCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisgICAgICAgIAlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisgICAgICAgIAkJICAgICAoKE5BTkRfQkFTRV9BRFI+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCisJfQorCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChPTkVOQU5EX0JBU0U+PjI0KSAmIDB4M0YpIHwKKyAgICAgICAgCQkgICAgICgxPDw2KSApLCAgKEdQTUNfQ09ORklHNyArIEdQTUNfQ09ORklHX0NTMCkpOworICAgICAgICAJZGVsYXkoMjAwMCk7CisKKyAgICAgICAgCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorICAgICAgICAJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorICAgICAgICAJCXJldHVybiAxOworICAgICAgICAJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKworICAgICAgIGxvbmcgc2l6ZSA9IDA7CisjaWZkZWYgQ0ZHX0NNRF9GQVQKKyAgICAgICBibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUMgXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkIFxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KDApOworICAgICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIDEpOworICAgICAgIHNpemUgPSBmaWxlX2ZhdF9yZWFkKCJ1LWJvb3QuYmluIiwgYnVmLCAwKTsKKyAgICAgICBpZiAoc2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgfQorICAgICAgIHByaW50ZigiXG4lbGQgQnl0ZXMgUmVhZCBmcm9tIE1NQyBcbiIsIHNpemUpOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBPUyBCb290bG9hZGVyIGZyb20gTU1DLi4uXG4iKTsKKyNlbmRpZgorICAgICAgIHJldHVybiBzaXplOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvYW0zNTE3ZXZtL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9jb25maWcubWsKQEAgLTAsMCArMSwxOSBAQAorIyAoQykgQ29weXJpZ2h0IDIwMDkKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGY2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0vcGxhdGZvcm0uUwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIE1hbmlrYW5kYW4gUGlsbGFpIDxtYW5pLnBpbGxhaUB0aS5jb20+CisgKiBUaGlzIGZpbGUgaXMgY29waWVkIGZyb20gYm9hcmQvb21hcDNldm0vcGxhdGZvcm0uUworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL2FtMzUxN2V2bS94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTBjZTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9hbTM1MTdldm0veC1sb2FkLmxkcwpAQCAtMCwwICsxLDUyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisgKiBUaGlzIGZpbGUgaXMgY29waWVkIGZyb20gYm9hcmQvb21hcDNldm0veC1sb2FkLmxkcworICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjY3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9NYWtlZmlsZQpAQCAtMCwwICsxLDYyIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorIyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgICBEZXNjcmlwdGlvbjoKKyMgICAgICBUaGlzIGZpbGUgaXMgdGhlIG1ha2UgZmlsZSBmb3IgcG9ydGlvbnMgb2YgWC1Mb2FkZXIgc3BlY2lmaWMKKyMgICAgICB0byB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorIworCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitDT0JKUwk6PSBkaWFtb25kLm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0ZTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL2NvbmZpZy5tawpAQCAtMCwwICsxLDIyIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwMDAwCitTVEFDS19CQVNFID0gMHg0MDIwRkNCMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvZGlhbW9uZC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvZGlhbW9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTc3OTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9kaWFtb25kLmMKQEAgLTAsMCArMSwxMDQ3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogICAgUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaXMgdGhlIGJvYXJkLXNwZWNpZmljIHNldC11cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZCwgYmFzZWQgb24gdGhlIFRJIE9NQVAzIEFNMzcwM0FDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBvbiBHUElPLCBSQU0gYW5kIGZsYXNoIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgT01BUDMgRVZNIGVxdWl2YWxlbnQgZmlsZS4KKyAqCisgKiAgICAgIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIG9yZGVyIGlzIHJvdWdobHk6CisgKgorICogICAgICAgIDEpIHNfaW5pdAorICogICAgICAgIDIpIGJvYXJkX2luaXQKKyAqICAgICAgICAzKSBtaXNjX2luaXRfcgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjZGVmaW5lIE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUyAoMykKKworCit2b2lkCit1ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykgeworCWRlbGF5KHVzZWNzKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2dldF9jcHVfaWQodm9pZCkKK3sKKwl1MzIgY3B1aWQgPSAwOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisKKwlyZXR1cm4gKGNwdWlkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlpZiAoKGNwdWlkICAmIDB4ZikgPT0gMHgwKSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMxKTsKKworCX0gZWxzZSB7CisJCXJldHVybiAoQ1BVXzM0MzBfRVMyKTsKKworCX0KKworfQorCit1MzIKK2lzX2NwdV9mYW1pbHkodm9pZCkKK3sKKwljb25zdCB1MzIgY3B1aWQgPSBnZXRfY3B1X2lkKCk7CisJdTMyIGNwdV9mYW1pbHkgPSAwLCBvbWFwMzR4eF9pZCA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlpZiAoKGNwdWlkICYgMHhmKSA9PSAweDApIHsKKwkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKworCX0gZWxzZSB7CisJCW9tYXAzNHh4X2lkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKG9tYXAzNHh4X2lkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCisJCWNhc2UgSEFXS0VZRV9BTTM1WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX0FNMzVYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzZYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM0WFg6CisJCWRlZmF1bHQ6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCQkJYnJlYWs7CisKKwkJfQorCX0KKworCXJldHVybiAoY3B1X2ZhbWlseSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMgorY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogIHZvaWQgc3IzMigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGNsZWFycyBhbmQgc2V0cyBhIHZhbHVlIGluIGEgYml0IGV4dGVudCBmb3IgYQorICogICAgMzItYml0IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyBhdCB3aGljaCB0byBjbGVhciBhbmQgc2V0IHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCAzMi1iaXQgdmFsdWUuCisgKiAgICBzdGFydF9iaXQgLSBUaGUgZmlyc3QgYml0IG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgbnVtX2JpdHMgIC0gVGhlIHJhbmdlIG9mIGJpdHMgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICB2YWx1ZSAgICAgLSBUaGUgdmFsdWUgdG8gc2V0LgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBhZGRyICAgICAgLSBUaGUgYWRkcmVzcyB3aXRoIHRoZSBzcGVjaWZpZWQgYml0IGV4dGVudCBjbGVhcmVkIGFuZAorICogICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisKKwltc2sgPSAoMSA8PCBudW1fYml0cyk7CisJLS1tc2s7CisJdG1wID0gX19yYXdfcmVhZGwoYWRkcikgJiB+KG1zayA8PCBzdGFydF9iaXQpOworCXRtcCB8PSAgdmFsdWUgPDwgc3RhcnRfYml0OworCV9fcmF3X3dyaXRlbCh0bXAsIGFkZHIpOworfQorCisvKgorICogIHUzMiB3YWl0X29uX3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmVhZHMgdGhlIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyBhbmQKKyAqICAgIGJ1c3kgd2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCBtYXRjaCB2YWx1ZSBpcyByZWFkIG9yIHVudGlsIHRoZQorICogICAgYm91bmRlZCBudW1iZXIgb2YgbG9vcHMgaGF2ZSBiZWVuIHJlYWNoZWQuCisgKgorICogIElucHV0KHMpOgorICogICAgcmVhZF9iaXRfbWFzayAtIFRoZSBiaXQgbWFzayB0byBhcHBseSBhZnRlciByZWFkaW5nIHRoZSByZWdpc3Rlci4KKyAqICAgIG1hdGNoX3ZhbHVlICAgLSBUaGUgdmFsdWUgdG8gbWF0Y2ggb24gYWZ0ZXIgcmVhZGluZyBhbmQgbWFza2luZy4KKyAqICAgIHJlYWRfYWRkciAgICAgLSBUaGUgcmVnaXN0ZXIgYWRkcmVzcyB0byByZWFkLgorICogICAgYm91bmQgICAgICAgICAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZWFkIGJlZm9yZSBnaXZpbmcKKyAqICAgICAgICAgICAgICAgICAgICB1cC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUcnVlICgxKSBpZiB0aGUgbWF0Y2hfdmFsdWUgd2FzIHJlYWNoZWQ7IG90aGVyd2lzZSwgZmFsc2UgKDApLgorICoKKyAqLwordTMyCit3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAorc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWNvbnN0IGludCB0eXBlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKwkvKgorCSAqIElmIHRoZSBwcm9jZXNzb3IgaXMgYSBHUCBkZXZpY2UsIHVubG9jayB0aGUgZGV2aWNlIFNSQU0gZm9yCisJICogZ2VuZXJhbCB1c2UuCisJICovCisKKwlpZiAodHlwZSA9PSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0dQKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBTRFJDIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChTRFJDX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChTRFJDX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfQ1NfQ0ZHKTsKKwlEVU1QX1JFR0woU0RSQ19TSEFSSU5HKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfQUREUik7CisJRFVNUF9SRUdMKFNEUkNfRVJSX1RZUEUpOworCURVTVBfUkVHTChTRFJDX0RMTEFfQ1RSTCk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9TVEFUVVMpOworCURVTVBfUkVHTChTRFJDX1BPV0VSX1JFRyk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18wKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8wKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzApOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzApOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzApOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzEpOworCURVTVBfUkVHTChTRFJDX01SXzEpOworCURVTVBfUkVHTChTRFJDX0VNUjJfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMSk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzEpOworfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19TRFJBTV9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX0dQTUNfREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgR1BNQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woR1BNQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKEdQTUNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUVNUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRRU5BQkxFKTsKKwlEVU1QX1JFR0woR1BNQ19USU1FT1VUX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VSUl9BRERSRVNTKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfVFlQRSApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRyApOworCURVTVBfUkVHTChHUE1DX1NUQVRVUyApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18wKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMSk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzIpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18zKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM181KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzUpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN182KTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNyk7CisKKyNpZiAwCisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF83KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU182KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzcpOworCisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMSk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09ORklHMik7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfUFJFRkVUQ0hfU1RBVFVTKTsKKworCURVTVBfUkVHTChHUE1DX0VDQ19DT05GSUcpOworCURVTVBfUkVHTChHUE1DX0VDQ19DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfU0laRV9DT05GSUcpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDMV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzJfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MzX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzVfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M2X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDN19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzhfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M5X1JFU1VMVCk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMF83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQxXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDJfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM18zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM180KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM181KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM182KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUM183KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9TV0RBVEEpOworI2VuZGlmCit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfZ3BtY19yZWdpc3Rlcl9kdW1wKCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX05BTkRfREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19QUkNNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFBSQ00gUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFBSQ01fUFJNX0NDUl9DTEtTRUwpOworCURVTVBfUkVHTChQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwzX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS0VOX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NBTSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DT1JFKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0RTUyk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfRU1VKTsKK30KKyNlbHNlCisjZGVmaW5lIG9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDRkdfUFJDTV9ERUJVRyAqLworCisvKgorICogIHZvaWQgY29uZmlnX2RpYW1vbmRfc2RyYW0oKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgcHJvY2Vzc29yJ3MgU0RSQU0gQ29udHJvbGxlciAoU0RSQykKKyAqICAgIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgMzIgTWIgeCAxNiBiICg2NAorICogICAgTWlCKSBERFIgU0RSQU0gb24gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2NvbmZpZ19kaWFtb25kX3NkcmFtKHZvaWQpCit7CisJdTMyIHZhbHVlLCBhY3RpbV9jdHJsYSwgYWN0aW1fY3RybGI7CisKKwkvKgorCSAqIFN0ZXAgMTogUmVzZXQgdGhlIFNEUkMgY29udHJvbGxlciBhbmQgdGhlbiB3YWl0IGZvciB0aGUgcmVzZXQKKwkgKiBldmVudCB0byBjbGVhci4KKwkgKi8KKworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgd2FpdF9vbl92YWx1ZShTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUsCisJCQkJICBTRFJDX1NUQVRVUywKKwkJCQkgIDEyMDAwMDAwKTsKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX0NMRUFSLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKgorCSAqIFN0ZXAgMjogU2V0dXAgdGhlIHBvc2l0aW9uIGFuZCBnZW9tZXRyeSBvZiB0aGUgU0RSQU0gZGV2aWNlIG9uCisJICogdGhlIGNvbnRyb2xsZXIncyBidXMuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1NIQVJJTkdfTE9DS19PRkYgCQkJCQkJCQkJCQkJfAorCQkgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX0NTME1VWENGR19FTkNPREUoU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMCkJfAorCQkgU0RSQ19TSEFSSU5HX1NEUkNUUklTVEFURV9PRkYpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19TSEFSSU5HKTsKKworCS8qCisJICogU3RlcCAzOiBTZXR1cCB0aGUgbWVtb3J5IGNvbmZpZ3VyYXRpb24sIGluY2x1ZGluZyBSQVMgd2lkdGgsCisJICogQ0FTIHdpZHRoLCBhZGRyZXNzIG11bHRpcGxleGluZywgc2l6ZSwgYmFuayBtYXBwaW5nLCBidXMgd2lkdGgsCisJICogcG93ZXIgbW9kZSwgRERSIHR5cGUgYW5kIG1lbW9yeSB0eXBlLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUlcJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfUkFTV0lEVEhfMTRfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19DQVNXSURUSF8xMF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19BRERSTVVYTEVHQUNZX0ZMRVhJQkxFCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUoQ0ZHX1NEUkFNX1NJWkVfTUIpCQkJCQl8CisJCSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQyl8CisJCSBTRFJDX01DRkdfQjMyTk9UMTZfT0ZGCQkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfREVFUFBEX1NVUFBPUlRFRAkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX0REUlRZUEVfTU9CSUxFX0REUikJCQl8CisJCSBTRFJDX01DRkdfUkFNVFlQRV9FTkNPREUoU0RSQ19NQ0ZHX1JBTVRZUEVfRERSKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01DRkdfMCk7CisKKwkvKgorCSAqIFN0ZXAgNDogRXN0YWJsaXNoIHRoZSBBQyBmaW5lIHR1bmluZyB0aW1pbmcgY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCisJYWN0aW1fY3RybGEKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkNEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REUExfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UREFMKSk7CisKKwlhY3RpbV9jdHJsYgorCQk9IChTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFApCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSKSk7CisKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxiLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJLyoKKwkgKiBTdGVwIDU6IEVzdGFibGlzaCB0aGUgbWVtb3J5IGF1dG9yZWZyZXNoIGNvbnRyb2wKKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfUkZSX0NUUkxfQVJDVl9FTkNPREUoMTI0NCkJCQkJCQl8CisJCSBTRFJDX1JGUl9DVFJMX0FSRV9FTkNPREUoU0RSQ19SRlJfQ1RSTF9BUkVfMV9BUkNWKSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1JGUl9DVFJMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0VOQ09ERSgwKQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0VOQUJMRQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fSURMRV9ESVNBQkxFCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX0VOQ09ERShTRFJDX1BPV0VSX1JFR19DTEtDVFJMX05PTkUpCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfUEFHRVBPTElDWV9IUEhCKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUE9XRVJfUkVHKTsKKworCS8qCisJICogU3RlcCA2OiBFc3RhYmxpc2ggdGhlIEpFREVDLWRlZmluZWQgbW9kZSBhbmQgRExMIHBhcmFtZXRlcnMuCisJICovCisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJZGVsYXkoNTAwMCk7CisKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9QUkVDSEFSR0VfQUxMKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19NUl9aRVJPXzEJCQkJCQkJfAorCQkgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJfAorCQkgU0RSQ19NUl9aRVJPXzAJCQkJCQkJfAorCQkgU0RSQ19NUl9DQVNMX0VOQ09ERShTRFJDX01SX0NBU0xfMykJfAorCQkgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQkJfAorCQkgU0RSQ19NUl9CTF9FTkNPREUoU0RSQ19NUl9CTF80KSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX01SXzApOworCisJdmFsdWUgPQorCQkoU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKDApCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKDApCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9FTkNPREUoU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX1BXRCkgfAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9ESUFNT05EX0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisJY2FzZSAxNToKKwkJbGlzdFswXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsxXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzJdID0gTU1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwljYXNlIDQ3OgorCQlsaXN0WzBdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMV0gPSBNTUNfTkFORDsKKwkJbGlzdFsyXSA9IEdQTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyAgICByZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvbXV4LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmY5MmY5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvbXV4LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQyCisKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiBHUE1DX0ExMCB0byBHUElPXzQzIHVzZWQgYXMgcHVzaC1wdWxsLCBhY3RpdmUgbG93IG91dHB1dAorCS8vIExDRF9uRU5CVUZGRVIgZm9yIHRoZSAxLjhWIHRvIDMuM1YgTENEIGJ1ZmZlciBlbmFibGUuCisKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzMgZm9yIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5ECisJLy8gRmxhc2gKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTNSBmb3IgU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQworCS8vIGFuZCBQSFkKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1M1CisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSUVOICB8IFBUVSB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQtdXNiLWxvYWRlci9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kLXVzYi1sb2FkZXIveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC11c2ItbG9hZGVyL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWI2Nzk1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBwb3J0aW9ucyBvZiBYLUxvYWRlciBzcGVjaWZpYworIyAgICAgIHRvIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisjCisKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGRpYW1vbmQubyBtdXgubyBwcmNtLm8KK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworQ1BQRkxBR1MgKz0gLUkkKFRPUERJUikvYm9hcmQvJChCT0FSRERJUikKKworU1JDUyAgICA6PSAkKFNPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUyAgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCitTT0JKUyAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSkKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoU09CSlMpICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoU09CSlMpICQoT0JKUykKKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46ICBjbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTM4MGMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjEgQEAKKworCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIE9NQVAzRVZNIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMjCisjCisjIE9NQVAzRVZNIGhhcyAxIGJhbmsgb2YgMTI4TUIgbVBPUC1TRFJBTSBvbiBDUzAKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDA4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9kaWFtb25kLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvZGlhbW9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDZmNjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvZGlhbW9uZC5jCkBAIC0wLDAgKzEsMTA3NSBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVMgKDEpCisKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKwljb25zdCB1MzIgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisJY29uc3QgdTMyIHBlcmlwaGVyYWxfdHlwZSA9IENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9QRVJJUEhFUkFMOworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYW5kIGNhbGxlcnMgb2YgaXQgYXJlIGltcGxpY2l0bHkgZXhwZWN0aW5nIHRoZQorCSAqIE1FTU9SWSBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMCkgbm90IHRoZSBQRVJISVBIRVJBTAorCSAqIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAxKSBib290IG9yZGVyLCBzbyBjaGVjayB0aGF0IGlzCisJICogYWN0dWFsbHkgdGhlIGNhc2UuCisJICovCisKKwlpZiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0RFQ09ERSh2YWx1ZSkgPT0gcGVyaXBoZXJhbF90eXBlKSB7CisJCWhhbmcoKTsKKwl9CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfRElBTU9ORF9CT09UX0RFVklDRVNdOworCWNvbnN0IHUzMiBtZW1fb3JkZXIgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworCisJLy8gc2V0IGRlZmF1bHRzCisJaW50IG51bWJlcl9vZl9kZXZpY2VzID0gMDsKKwkqZGV2aWNlc19saXN0ID0gJmxpc3RbMF07CisKKwlzd2l0Y2ggKG1lbV9vcmRlcikgeworCisJY2FzZSAwOgorCWNhc2UgMjoKKwljYXNlIDQ6CisJY2FzZSAxNjoKKwljYXNlIDIyOgorICAgICAgICBsaXN0WzBdID0gR1BNQ19PTkVOQU5EOworICAgICAgICBudW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9ESUFNT05EX0JPT1RfREVWSUNFUzsKKyAgICAgICAgYnJlYWs7CisJY2FzZSAxOgorCWNhc2UgMTI6CisJY2FzZSAxNToKKwljYXNlIDIxOgorCWNhc2UgMjc6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX05BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDM6CisJY2FzZSA2OgorICAgICAgICBsaXN0WzBdID0gTU1DX09ORU5BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDg6CisJY2FzZSAxMToKKwljYXNlIDE0OgorCWNhc2UgMjA6CisJY2FzZSAyNjoKKyAgICAgICAgbGlzdFswXSA9IEdQTUNfTURPQzsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCWNhc2UgMTc6CisJY2FzZSAxODoKKwljYXNlIDI0OgorICAgICAgICBsaXN0WzBdID0gTU1DX05BTkQ7CisgICAgICAgIG51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0RJQU1PTkRfQk9PVF9ERVZJQ0VTOworICAgICAgICBicmVhazsKKwljYXNlIDc6CisJY2FzZSAxMDoKKwljYXNlIDEzOgorCWNhc2UgMTk6CisJY2FzZSAyNToKKworCWRlZmF1bHQ6CisgICAgICAgIGxpc3RbMF0gPSBHUE1DX05PUjsKKyAgICAgICAgbnVtYmVyX29mX2RldmljZXMgPSBNQVhfRElBTU9ORF9CT09UX0RFVklDRVM7CisgICAgICAgIGJyZWFrOworCX0KKyAgICByZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjkyZjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvbXV4LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElFTiAgfCBQVFUgfCBESVMgfCBNNCkpOwkvLyBHUElPXzQyCisKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiBHUE1DX0ExMCB0byBHUElPXzQzIHVzZWQgYXMgcHVzaC1wdWxsLCBhY3RpdmUgbG93IG91dHB1dAorCS8vIExDRF9uRU5CVUZGRVIgZm9yIHRoZSAxLjhWIHRvIDMuM1YgTENEIGJ1ZmZlciBlbmFibGUuCisKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT180MworI2Vsc2UKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKyNpZiBkZWZpbmVkKENPTkZJR19ESUFNT05EX0JPQVJEX0RFVkVMT1BNRU5UKQorCS8vIEFzc2lnbiB0byBHUE1DX05DUzMgZm9yIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5ECisJLy8gRmxhc2gKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MzCisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorI2lmIGRlZmluZWQoQ09ORklHX0RJQU1PTkRfQk9BUkRfREVWRUxPUE1FTlQpCisJLy8gQXNzaWduIHRvIEdQTUNfTkNTNSBmb3IgU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQworCS8vIGFuZCBQSFkKKworCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1M1CisjZWxzZQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVCkgKi8KKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSUVOICB8IFBUVSB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRU4gIHwgUFREIHwgRElTIHwgTTUpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDlkMjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNmU1YQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9ESUFNT05EX1BMQVRGT1JNX0hfCisjZGVmaW5lIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0RJQU1PTkRfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvZGlhbW9uZC9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcHJjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjVhZDcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2RpYW1vbmQveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYwM2EyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9kaWFtb25kL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZTRhOTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsNjIgQEAKKyMKKyMgICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisjICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICAgIERlc2NyaXB0aW9uOgorIyAgICAgIFRoaXMgZmlsZSBpcyB0aGUgbWFrZSBmaWxlIGZvciBwb3J0aW9ucyBvZiBYLUxvYWRlciBzcGVjaWZpYworIyAgICAgIHRvIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisjCisKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK0NPQkpTCTo9IGo0OS5vIG11eC5vIHByY20ubworU09CSlMJOj0gcGxhdGZvcm0ubworCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKQorCitTUkNTICAgIDo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NPQkpTICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoU09CSlMpKQorCiskKExJQik6ICQob2JqKS5kZXBlbmQgJChTT0JKUykgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChTT0JKUykgJChPQkpTKQorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjogIGNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQ5NjBjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9jb25maWcubWsKQEAgLTAsMCArMSwyMSBAQAorCisKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KKworVEVYVF9CQVNFID0gMHg0MDIwMDAwMAorU1RBQ0tfQkFTRSA9IDB4NDAyMEZDQjAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvajQ5LmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2o0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MDliYmMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL2o0OS5jCkBAIC0wLDAgKzEsMTA0NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNgorICogICAgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogICAgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNBQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgb24gR1BJTywgUkFNIGFuZCBmbGFzaCBpbml0aWFsaXphdGlvbi4KKyAqCisgKiAgICAgIFRoaXMgaXMgaW5oZXJpdGVkIGZyb20gdGhlIE9NQVAzIEVWTSBlcXVpdmFsZW50IGZpbGUuCisgKgorICogICAgICBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBvcmRlciBpcyByb3VnaGx5OgorICoKKyAqICAgICAgICAxKSBzX2luaXQKKyAqICAgICAgICAyKSBib2FyZF9pbml0CisgKiAgICAgICAgMykgbWlzY19pbml0X3IKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworI2RlZmluZSBNQVhfSjQ5X0JPT1RfREVWSUNFUyAoMykKKwordm9pZAordWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitnZXRfY3B1X2lkKHZvaWQpCit7CisJdTMyIGNwdWlkID0gMDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCisJcmV0dXJuIChjcHVpZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2dldF9jcHVfcmV2KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJaWYgKChjcHVpZCAgJiAweGYpID09IDB4MCkgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMSk7CisKKwl9IGVsc2UgeworCQlyZXR1cm4gKENQVV8zNDMwX0VTMik7CisKKwl9CisKK30KKwordTMyCitpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJY29uc3QgdTMyIGNwdWlkID0gZ2V0X2NwdV9pZCgpOworCXUzMiBjcHVfZmFtaWx5ID0gMCwgb21hcDM0eHhfaWQgPSAwOworCXUxNiBoYXdrZXllOworCisJaWYgKChjcHVpZCAmIDB4ZikgPT0gMHgwKSB7CisJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisKKwl9IGVsc2UgeworCQlvbWFwMzR4eF9pZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0NPTlRST0xfSUQpOworCQloYXdrZXllICA9IChvbWFwMzR4eF9pZCA+PiBIQVdLRVlFX1NISUZUKSAmIDB4ZmZmZjsKKworCQlzd2l0Y2ggKGhhd2tleWUpIHsKKworCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9BTTM1WFg7CisJCQlicmVhazsKKworCQljYXNlIEhBV0tFWUVfT01BUDM2WFg6CisJCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNlhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQlkZWZhdWx0OgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzRYWDsKKwkJCWJyZWFrOworCisJCX0KKwl9CisKKwlyZXR1cm4gKGNwdV9mYW1pbHkpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIKK2NwdV9pc18zNDEwKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpZihnZXRfY3B1X3JldigpIDwgQ1BVXzM0MzBfRVMyKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIHJlYWQgc2NhbGFiaWxpdHkgc3RhdHVzIGFuZCByZXR1cm4gMSBmb3IgMzQxMCovCisJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKENPTlRST0xfU0NBTEFCTEVfT01BUF9TVEFUVVMpOworCQkvKiBDaGVjayB3aGV0aGVyIE1QVSBmcmVxdWVuY3kgaXMgc2V0IHRvIDI2NiBNSHogd2hpY2gKKwkJICogaXMgbm9taW5hbCBmb3IgMzQxMC4gSWYgeWVzIHJldHVybiB0cnVlIGVsc2UgZmFsc2UKKwkJICovCisJCWlmICgoKHN0YXR1cyA+PiA4KSAmIDB4MykgPT0gMHgyKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqICB2b2lkIHNyMzIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBjbGVhcnMgYW5kIHNldHMgYSB2YWx1ZSBpbiBhIGJpdCBleHRlbnQgZm9yIGEKKyAqICAgIDMyLWJpdCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgKgorICogIElucHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3MgYXQgd2hpY2ggdG8gY2xlYXIgYW5kIHNldCB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICBzcGVjaWZpZWQgMzItYml0IHZhbHVlLgorICogICAgc3RhcnRfYml0IC0gVGhlIGZpcnN0IGJpdCBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIG51bV9iaXRzICAtIFRoZSByYW5nZSBvZiBiaXRzIG9mIHRoZSAzMi1iaXQgZGF0YSB0byBjbGVhciBhbmQgc2V0LgorICogICAgdmFsdWUgICAgIC0gVGhlIHZhbHVlIHRvIHNldC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYWRkciAgICAgIC0gVGhlIGFkZHJlc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGJpdCBleHRlbnQgY2xlYXJlZCBhbmQKKyAqICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzcjMyKHUzMiBhZGRyLCB1MzIgc3RhcnRfYml0LCB1MzIgbnVtX2JpdHMsIHUzMiB2YWx1ZSkKK3sKKwl1MzIgdG1wLCBtc2sgPSAwOworCisJbXNrID0gKDEgPDwgbnVtX2JpdHMpOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoKKyAqICB1MzIgd2FpdF9vbl92YWx1ZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJlYWRzIHRoZSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYW5kCisgKiAgICBidXN5IHdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgbWF0Y2ggdmFsdWUgaXMgcmVhZCBvciB1bnRpbCB0aGUKKyAqICAgIGJvdW5kZWQgbnVtYmVyIG9mIGxvb3BzIGhhdmUgYmVlbiByZWFjaGVkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIHJlYWRfYml0X21hc2sgLSBUaGUgYml0IG1hc2sgdG8gYXBwbHkgYWZ0ZXIgcmVhZGluZyB0aGUgcmVnaXN0ZXIuCisgKiAgICBtYXRjaF92YWx1ZSAgIC0gVGhlIHZhbHVlIHRvIG1hdGNoIG9uIGFmdGVyIHJlYWRpbmcgYW5kIG1hc2tpbmcuCisgKiAgICByZWFkX2FkZHIgICAgIC0gVGhlIHJlZ2lzdGVyIGFkZHJlc3MgdG8gcmVhZC4KKyAqICAgIGJvdW5kICAgICAgICAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdG8gcmVhZCBiZWZvcmUgZ2l2aW5nCisgKiAgICAgICAgICAgICAgICAgICAgdXAuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVHJ1ZSAoMSkgaWYgdGhlIG1hdGNoX3ZhbHVlIHdhcyByZWFjaGVkOyBvdGhlcndpc2UsIGZhbHNlICgwKS4KKyAqCisgKi8KK3UzMgord2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3NlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAordHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwljb25zdCBpbnQgdHlwZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCisJLyoKKwkgKiBJZiB0aGUgcHJvY2Vzc29yIGlzIGEgR1AgZGV2aWNlLCB1bmxvY2sgdGhlIGRldmljZSBTUkFNIGZvcgorCSAqIGdlbmVyYWwgdXNlLgorCSAqLworCisJaWYgKHR5cGUgPT0gQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9HUCkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCisJcmV0dXJuOworfQorCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgU0RSQyBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woU0RSQ19SRVZJU0lPTik7CisJRFVNUF9SRUdMKFNEUkNfU1lTQ09ORklHKTsKKwlEVU1QX1JFR0woU0RSQ19TWVNTVEFUVVMpOworCURVTVBfUkVHTChTRFJDX0NTX0NGRyk7CisJRFVNUF9SRUdMKFNEUkNfU0hBUklORyk7CisJRFVNUF9SRUdMKFNEUkNfRVJSX0FERFIpOworCURVTVBfUkVHTChTRFJDX0VSUl9UWVBFKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX0NUUkwpOworCURVTVBfUkVHTChTRFJDX0RMTEFfU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19QT1dFUl9SRUcpOworCURVTVBfUkVHTChTRFJDX01DRkdfMCk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMCk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8wKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUNGR18xKTsKKwlEVU1QX1JFR0woU0RSQ19NUl8xKTsKKwlEVU1QX1JFR0woU0RSQ19FTVIyXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxBXzEpOworCURVTVBfUkVHTChTRFJDX0FDVElNX0NUUkxCXzEpOworCURVTVBfUkVHTChTRFJDX1JGUl9DVFJMXzEpOworCURVTVBfUkVHTChTRFJDX01BTlVBTF8xKTsKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfU0RSQU1fREVCVUcpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIEdQTUMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKEdQTUNfUkVWSVNJT04pOworCURVTVBfUkVHTChHUE1DX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFTVEFUVVMpOworCURVTVBfUkVHTChHUE1DX0lSUUVOQUJMRSk7CisJRFVNUF9SRUdMKEdQTUNfVElNRU9VVF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19FUlJfQUREUkVTUyk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX1RZUEUgKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcgKTsKKwlEVU1QX1JFR0woR1BNQ19TVEFUVVMgKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMCk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzEpOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18yKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMyk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM180KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzQpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN181KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNik7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM183KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzcpOworCisjaWYgMAorCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU181KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV80KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV83KTsKKworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzEpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTkZJRzIpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX1BSRUZFVENIX1NUQVRVUyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09ORklHKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0NfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX1NJWkVfQ09ORklHKTsKKworCURVTVBfUkVHTChHUE1DX0VDQzFfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0MyX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDM19SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzRfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M1X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzdfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M4X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOV9SRVNVTFQpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDBfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMV83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQyXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDNfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfU1dEQVRBKTsKKyNlbmRpZgorfQorI2Vsc2UKKyMgZGVmaW5lIG9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfUFJDTV9ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBQUkNNIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChQUkNNX1BSTV9DQ1JfQ0xLU0VMKTsKKwlEVU1QX1JFR0woUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMM19QTEwpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9NUFUpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTDJfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtFTl9QTExfSVZBMik7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9DQU0pOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ09SRSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTF9EU1MpOworCURVTVBfUkVHTChDTV9DTEtTRUwxX0VNVSk7Cit9CisjZWxzZQorI2RlZmluZSBvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ0ZHX1BSQ01fREVCVUcgKi8KKworLyoKKyAqICB2b2lkIGNvbmZpZ19kaWFtb25kX3NkcmFtKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIHByb2Nlc3NvcidzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisgKiAgICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDMyIE1iIHggMTYgYiAoNjQKKyAqICAgIE1pQikgRERSIFNEUkFNIG9uIHRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitjb25maWdfZGlhbW9uZF9zZHJhbSh2b2lkKQoreworCXUzMiB2YWx1ZSwgYWN0aW1fY3RybGEsIGFjdGltX2N0cmxiOworCisJLyoKKwkgKiBTdGVwIDE6IFJlc2V0IHRoZSBTRFJDIGNvbnRyb2xsZXIgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIHJlc2V0CisJICogZXZlbnQgdG8gY2xlYXIuCisJICovCisKKyAgICBfX3Jhd193cml0ZWwoU0RSQ19TWVNDT05GSUdfU09GVFJFU0VUX1NFVCwgU0RSQ19TWVNDT05GSUcpOworICAgIHdhaXRfb25fdmFsdWUoU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TWVNTVEFUVVNfUkVTRVRET05FLAorCQkJCSAgU0RSQ19TVEFUVVMsCisJCQkJICAxMjAwMDAwMCk7CisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUiwgU0RSQ19TWVNDT05GSUcpOworCisJLyoKKwkgKiBTdGVwIDI6IFNldHVwIHRoZSBwb3NpdGlvbiBhbmQgZ2VvbWV0cnkgb2YgdGhlIFNEUkFNIGRldmljZSBvbgorCSAqIHRoZSBjb250cm9sbGVyJ3MgYnVzLgorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGIAkJCQkJCQkJCQkJCXwKKwkJIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzFNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfRU5DT0RFKFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzE2XzApCXwKKwkJIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfU0hBUklORyk7CisKKwkvKgorCSAqIFN0ZXAgMzogU2V0dXAgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uLCBpbmNsdWRpbmcgUkFTIHdpZHRoLAorCSAqIENBUyB3aWR0aCwgYWRkcmVzcyBtdWx0aXBsZXhpbmcsIHNpemUsIGJhbmsgbWFwcGluZywgYnVzIHdpZHRoLAorCSAqIHBvd2VyIG1vZGUsIEREUiB0eXBlIGFuZCBtZW1vcnkgdHlwZS4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfTUNGR19MT0NLU1RBVFVTX1JXCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX1JBU1dJRFRIXzE0X0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0NBU1dJRFRIX0VOQ09ERShTRFJDX01DRkdfQ0FTV0lEVEhfMTBfQklUUykJCQl8CisJCSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVNJWkVfRU5DT0RFKENGR19TRFJBTV9TSVpFX01CKQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0VOQ09ERShTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fUl9CX0MpfAorCQkgU0RSQ19NQ0ZHX0IzMk5PVDE2X09GRgkJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQkJCQkJCQkJfAorCQkgU0RSQ19NQ0ZHX0REUlRZUEVfRU5DT0RFKFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIpCQkJfAorCQkgU0RSQ19NQ0ZHX1JBTVRZUEVfRU5DT0RFKFNEUkNfTUNGR19SQU1UWVBFX0REUikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NQ0ZHXzApOworCisJLyoKKwkgKiBTdGVwIDQ6IEVzdGFibGlzaCB0aGUgQUMgZmluZSB0dW5pbmcgdGltaW5nIGNoYXJhY3RlcmlzdGljcy4KKwkgKi8KKworCWFjdGltX2N0cmxhCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJBUykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSUkRfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9URFBMKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTCkpOworCisJYWN0aW1fY3RybGIKKwkJPSAoU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRSkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYUF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUikpOworCisJX19yYXdfd3JpdGVsKGFjdGltX2N0cmxhLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYiwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qCisJICogU3RlcCA1OiBFc3RhYmxpc2ggdGhlIG1lbW9yeSBhdXRvcmVmcmVzaCBjb250cm9sCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKDEyNDQpCQkJCQkJfAorCQkgU0RSQ19SRlJfQ1RSTF9BUkVfRU5DT0RFKFNEUkNfUkZSX0NUUkxfQVJFXzFfQVJDVikpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19SRlJfQ1RSTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfUE9XRVJfUkVHX1dBS0VVUF9ERUxBWUVECQkJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0FVVE9DT1VOVF9FTkNPREUoMCkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX1JTVF9FTkFCTEUJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19TUkZSX09OX0lETEVfRElTQUJMRQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUoU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9OT05FKQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1BPV0VSX1JFRyk7CisKKwkvKgorCSAqIFN0ZXAgNjogRXN0YWJsaXNoIHRoZSBKRURFQy1kZWZpbmVkIG1vZGUgYW5kIERMTCBwYXJhbWV0ZXJzLgorCSAqLworCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCWRlbGF5KDUwMDApOwkgICAgICAgICAgICAgICAgIAorCisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfUFJFQ0hBUkdFX0FMTCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKFNEUkNfTUFOVUFMX0NNRENPREVfRU5DT0RFKFNEUkNfTUFOVUFMX0NNRENPREVfQVVUT1JFRlJFU0gpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfTVJfWkVST18xCQkJCQkJCXwKKwkJIFNEUkNfTVJfV0JTVF9FTkFCTEUJCQkJCXwKKwkJIFNEUkNfTVJfWkVST18wCQkJCQkJCXwKKwkJIFNEUkNfTVJfQ0FTTF9FTkNPREUoU0RSQ19NUl9DQVNMXzMpCXwKKwkJIFNEUkNfTVJfU0lMX1NFUklBTAkJCQkJCXwKKwkJIFNEUkNfTVJfQkxfRU5DT0RFKFNEUkNfTVJfQkxfNCkpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19NUl8wKTsKKworCXZhbHVlID0KKwkJKFNEUkNfRExMQV9DVFJMX0ZJWEVEX0RFTEFZX0VOQ09ERSgwKQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0VOQ09ERSgwKQkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QpIHwgCisJCSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTE9DS19UUkFDS0lOR0RFTEFZKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfRExMQV9DVFJMKTsKKworCS8qCisJICogRGVsYXkgZm9yIGEgInJlYXNvbmFibHkgbG9uZyIgcGVyaW9kIG9mIHRpbWUgdG8gYWxsb3cgdGhlCisJICogcmVxdWVzdGVkIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuCisJICovCisKKyAJZGVsYXkoMHgyMDAwMCk7Cit9CisKKy8qCisgKiAgdm9pZCBzX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyB2ZXJ5IGVhcmx5IHN5c3RlbSBpbml0aWFsaXphdGlvbiBvZiBjaGlwCisgKiAgICBwaW4gbXVsdGlwbGV4aW5nIGFuZCBjbG9ja3MgYW5kIGlzIGNhbGxlZCB3aGVuIE9OTFkgYW4KKyAqICAgIFNSQU0tYmFzZWQgc3RhY2sgaXMgYXZhaWxhYmxlIChpLmUuIG5vIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3NfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKworCWRlbGF5KDEwMCk7CisKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ19kaWFtb25kX3NkcmFtKCk7Cit9CisKKy8qCisgKiAgaW50IGJvYXJkX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgZWFybHksIGJvYXJkLXNwZWNpZmljIGluaXRpYWxpemF0aW9uCisgKiAgICBmb2xsb3dpbmcgY29yZSBDUFUgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50Citib2FyZF9pbml0KHZvaWQpCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X2RldmljZV90eXBlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgREVWSUNFVFlQRSBmaWVsZCwgaW5kaWNhdGluZyB3aGV0aGVyIHRoZQorICogICAgZGV2aWNlIGlzIG9mIFRTVCwgRU1VLCBIUyBvciBHUCB0eXBlLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQuCisgKgorICovCit1MzIKK2dldF9kZXZpY2VfdHlwZSh2b2lkKQoreworCWNvbnN0IGludCB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodmFsdWUpKTsKK30KKworLyoKKyAqICB1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBkZWNvZGVkIHZhbHVlIGZyb20gdGhlIENQVSdzCisgKiAgICBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBTWVNCT09UIG9yZGVyIHN1YmZpZWxkLCBpbmRpY2F0aW5nIHRoZQorICogICAgb3JkZXIgb2YgbWVtb3J5IGludGVyZmFjZXMgZnJvbSB3aGljaCB0aGUgcHJvY2Vzc29yIHdpbGwgYXR0ZW1wdAorICogICAgdG8gYm9vdCBpdHNlbGYuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIGRlY29kZWQgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZC4KKyAqCisgKi8KK3UzMgorZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyNpZiAwCisJY29uc3QgdTMyIHZhbHVlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpOworCWNvbnN0IHUzMiBwZXJpcGhlcmFsX3R5cGUgPSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfUEVSSVBIRVJBTDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGFuZCBjYWxsZXJzIG9mIGl0IGFyZSBpbXBsaWNpdGx5IGV4cGVjdGluZyB0aGUKKwkgKiBNRU1PUlkgaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDApIG5vdCB0aGUgUEVSSElQSEVSQUwKKwkgKiBpbnRlcmZhY2UgKFNZU0JPT1RbNV0gPT0gMSkgYm9vdCBvcmRlciwgc28gY2hlY2sgdGhhdCBpcworCSAqIGFjdHVhbGx5IHRoZSBjYXNlLgorCSAqLworCisJaWYgKENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9ERUNPREUodmFsdWUpID09IHBlcmlwaGVyYWxfdHlwZSkgeworCQloYW5nKCk7CisJfQorCisJcmV0dXJuIChDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX0RFQ09ERSh2YWx1ZSkpOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIDB4M2Y7CisjZW5kaWYKK30KKworLyoKKyAqICBpbnQgZ2V0X2Jvb3RfZGV2aWNlX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlX2xpc3QpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgYSBjb25zdGFudCBsaXN0IGluZGljYXRpbmcgdGhlIHByZWZlcnJlZAorICogICAgZGV2aWNlIGJvb3QgbGlzdC4KKyAqICAgIEl0IGdldHMgY2FsbGVkIGZyb20gc3RhcnRfYXJtYm9vdCBpbiBib2FyZC5jCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgVGhlIHByZWZlcnJlZCBmaXJzdCBwcm9jZXNzb3IgbWVtb3J5IGJvb3QgaW50ZXJmYWNlLgorICoKKyAqLworCitpbnQKK2dldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpCit7CisJc3RhdGljIHUzMiBsaXN0W01BWF9KNDlfQk9PVF9ERVZJQ0VTXTsKKwljb25zdCB1MzIgbWVtX29yZGVyID0gZ2V0X3N5c2Jvb3RfdmFsdWUoKTsKKworCS8vIHNldCBkZWZhdWx0cworCWludCBudW1iZXJfb2ZfZGV2aWNlcyA9IDA7CisJKmRldmljZXNfbGlzdCA9ICZsaXN0WzBdOworCisJc3dpdGNoIChtZW1fb3JkZXIpIHsKKwljYXNlIDE1OgorCQlsaXN0WzBdID0gR1BNQ19OQU5EOworCQlsaXN0WzFdID0gVVNCX1BFUklQSEVSQUw7CisJCWxpc3RbMl0gPSBNTUNfTkFORDsKKwkJbnVtYmVyX29mX2RldmljZXMgPSBNQVhfSjQ5X0JPT1RfREVWSUNFUzsKKwkJYnJlYWs7CisJY2FzZSA0NzoKKwkJbGlzdFswXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzFdID0gTU1DX05BTkQ7CisJCWxpc3RbMl0gPSBHUE1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbnVtYmVyX29mX2RldmljZXM7Cit9CisKKy8qCisgKiAgaW50IG1pc2NfaW5pdF9yKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IG1pc2NlbGxhbmVvdXMsIGJvYXJkLXNwZWNpZmljCisgKiAgICBpbml0aWFsaXphdGlvbiBmb2xsb3dpbmcgQ1BVLCBlYXJseSBib2FyZCwgc2VyaWFsIGFuZCBOQU5ECisgKiAgICBpbml0aWFsaXphdGlvbiBidXQgcHJpb3IgdG8gbG9hZGluZyB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyCisgKiAgICB0byBSQU0uCisgKgorICogICAgQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyBib2FyZC1zcGVjaWZpYyB0byBkby4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE9LOyBvdGhlcndpc2UsIG5vbi16ZXJvIG9uIGVycm9yLgorICoKKyAqLworaW50CittaXNjX2luaXRfcih2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKQoreworCWludCBwZW5kaW5nID0gMTsKKworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAord2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCS8qIFRoZXJlIGFyZSAzIHdhdGNoIGRvZ3MgV0QxPVNlY3VyZSwgV0QyPU1QVSwgV0QzPUlWQS4gV0QxIGlzCisJICogZWl0aGVyIHRha2VuIGNhcmUgb2YgYnkgUk9NIChIUy9FTVUpIG9yIG5vdCBhY2Nlc3NpYmxlIChHUCkuCisJICogV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgV0QyLU1QVSBvciB0YWtlIGEgUFJDTSByZXNldC4gIFdEMworCSAqIHNob3VsZCBub3QgYmUgcnVubmluZyBhbmQgZG9lcyBub3QgZ2VuZXJhdGUgYSBQUkNNIHJlc2V0LgorCSAqLworCXNyMzIoQ01fRkNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXNyMzIoQ01fSUNMS0VOX1dLVVAsIDUsIDEsIDEpOworCXdhaXRfb25fdmFsdWUoQklUNSwgMHgyMCwgQ01fSURMRVNUX1dLVVAsIDUpOyAvKiBzb21lIGlzc3VlIGhlcmUgKi8KKworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxLCBXRDJfQkFTRSArIFdTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0QyX0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syLCBXRDJfQkFTRSArIFdTUFIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiAgdm9pZCBmb29iYXIoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZS4uLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTUMKKwkvKiBFbmFibGUgTU1DMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMjQsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dwbWNfY29uZmlnXzAodm9pZCkKK3sKKyNpZiBkZWZpbmVkKENGR19HUE1DX0NPTkZJRzFfMCkKKwkvKgorCSAqIEZpcnN0LCBkaXNhYmxlIHRoZSBpbnRlcmZhY2UgYW5kIHdhaXQuCisJICovCisJX19yYXdfd3JpdGVsKEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVELCBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgxMDAwKTsKKworCS8qCisJICogTmV4dCwgcHJvZ3JhbSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgorCSAqLworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUcxXzAsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMl8wLCBHUE1DX0NPTkZJRzJfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzNfMCwgR1BNQ19DT05GSUczXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc0XzAsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNV8wLCBHUE1DX0NPTkZJRzVfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzZfMCwgR1BNQ19DT05GSUc2XzApOworCisJLyoKKwkgKiBGaW5hbGx5LCBlbmFibGUgdGhlIEdQTUMgbWFwcGluZyBhbmQgc3BpbiBmb3IgdGhlIHBhcmFtZXRlcnMgdG8KKwkgKiBiZWNvbWUgYWN0aXZlLgorCSAqLworCV9fcmF3X3dyaXRlbCgoQ0ZHX0dQTUNfQ09ORklHN18wIHwgR1BNQ19DT05GSUc3X0NTVkFMSURfRU5BQkxFRCksCisJCQkJIEdQTUNfQ09ORklHN18wKTsKKworCWRlbGF5KDIwMDApOworCisJaWYgKG5hbmRfY2hpcCgpKXsKKwkJcmV0dXJuICgxKTsKKwl9CisjZW5kaWYgLyogZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApICovCisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogIGludCBuYW5kX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyB0aGUgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyCisgKiAgICAoR1BNQykgc3VjaCB0aGF0IG9uLWJvYXJkIE5BTkQgZGV2aWNlcyBtYXkgYmUgYWNjZXNzZWQgZm9yCisgKiAgICBzZWNvbmQtc3RhZ2UgYm9vdC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICAwIGlmIE5BTkQgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZDsgb3RoZXJ3aXNlLCAxLgorICoKKyAqLworaW50CituYW5kX2luaXQodm9pZCkKK3sKKwlpbnQgc3RhdHVzID0gMTsKKworCS8qCisJICogRXN0YWJsaXNoIEdQTUMgZ2xvYmFsIHNldHRpbmdzLgorCSAqLworCisJX19yYXdfd3JpdGVsKEdQTUNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJULCBHUE1DX1NZU0NPTkZJRyk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19JUlFFTkFCTEVfQUxMX0RJU0FCTEUsIEdQTUNfSVJRRU5BQkxFKTsKKworCV9fcmF3X3dyaXRlbChHUE1DX1RJTUVPVVRFTkFCTEVfT0ZGLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisKKwlpZiAoZ3BtY19jb25maWdfMCgpKSB7CisJCXB1dHMoIlVuc3VwcG9ydGVkIE5BTkQgZGV2aWNlIEAgR1BNQzAhXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCXN0YXR1cyA9IDA7CisKKyBkb25lOgorCS8qIER1bXAgR1BNQyBhbmQgU0RSQyByZWdpc3RlcnMgaWYgc28gY29uZmlndXJlZC4gKi8KKworCW9tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX2dwbWNfcmVnaXN0ZXJfZHVtcCgpOworCW9tYXAzX3ByY21fcmVnaXN0ZXJfZHVtcCgpOworCisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogIHZvaWQgYm9hcmRfaGFuZygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBib2FyZC1zcGVjaWZpYyBhY3Rpb25zIHdoZW4gdGhlIHN5c3RlbQorICogICAgaGFuZ3MgYnkgZXhlY3V0aW5nIGhhbmcoKS4gQXQgcHJlc2VudCwgdGhlcmUgaXMgbm90aGluZyB0byBkbzsKKyAqICAgIGhvd2V2ZXIsIHdlIG1pZ2h0IGxhdGVyIGRyaXZlIHRoZSBwaWV6byBvciBhIExFRC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK2JvYXJkX2hhbmcgKHZvaWQpCit7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9tdXguYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2RmMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvbXV4LmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBJL08gcGFkIG11bHRpcGxleGVyIGNvbmZpZ3VyYXRpb24uCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHZvaWQgc2V0X211eGNvbmZfcmVncygpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lcyBzZXRzIHRoZSBJL08gcGFkIG11bHRpcGxleGVycyBmb3IgVUFSVCwgR1BNQywgU0RSQywKKyAqICAgIEdQSU8uCisgKgorICogVGhlIGNvbW1lbnRlZCBzdHJpbmcgZ2l2ZXMgdGhlIGZpbmFsIG11eCBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBpbgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICovCit2b2lkCitzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJLyoKKwkgKiBUaGUgYml0IGZpZWxkcyBmb3IgdGhlc2Ugc2V0dGluZ3MgYXJlIGFzIGZvbGxvd3M6CisJICoKKwkgKiAgIEl7RU4sRElTfQkgCS0gSW5wdXQgRW5hYmxlL0Rpc2FibGUKKwkgKiAgIFBUW0RVXQkJIAktIFB1bGwtZG93biwgLXVwCisJICogICBESVMsRU4JCSAgCS0gUHVsbC1kb3duLCAtdXAgZGlzYWJsZWQvZW5hYmxlZAorCSAqICAgTVswMTIzNDU2N10JLSBDb25maWd1cmF0aW9uIG1vZGUgMC03CisJICovCisKKwkvKgorCSAqIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpCisJICoKKwkgKiBNb3N0IG9mIHRoZSBTRFJDIHNpZ25hbHMgYXJlIHVzZWQgdG8gZHJpdmUgdGhlIFNhbXN1bmcKKwkgKiBLNFg1MTE2M1BJLUZDRzYgNTEyIE1iIHggMTYtYml0ICg2NCBNaUIpIEREUiBTRFJBTS4gQmVjYXVzZSB3ZQorCSAqIGludGVyZmFjZSBpbiAxNi1iaXQgcmF0aGVyIHRoYW4gMzItYml0IG1vZGUsIHdlIHBsYWNlIHRoZQorCSAqIHVudXNlZCBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKwkgKi8KKworCU1VWF9WQUwoQ1AoU0RSQ19EMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDAKKwlNVVhfVkFMKENQKFNEUkNfRDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QxCisJTVVYX1ZBTChDUChTRFJDX0QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMgorCU1VWF9WQUwoQ1AoU0RSQ19EMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDMKKwlNVVhfVkFMKENQKFNEUkNfRDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q0CisJTVVYX1ZBTChDUChTRFJDX0Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENQorCU1VWF9WQUwoQ1AoU0RSQ19ENiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDYKKwlNVVhfVkFMKENQKFNEUkNfRDcpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q3CisJTVVYX1ZBTChDUChTRFJDX0Q4KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EOAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDkKKwlNVVhfVkFMKENQKFNEUkNfRDEwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTAKKwlNVVhfVkFMKENQKFNEUkNfRDExKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTEKKwlNVVhfVkFMKENQKFNEUkNfRDEyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTIKKwlNVVhfVkFMKENQKFNEUkNfRDEzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTMKKwlNVVhfVkFMKENQKFNEUkNfRDE0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTQKKwlNVVhfVkFMKENQKFNEUkNfRDE1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMTUKKworCS8vIEJlY2F1c2Ugd2UgaW50ZXJmYWNlIFNEUkFNIGluIDE2LWJpdCBtb2RlLCBwbGFjZQorCS8vIFNEUkNfREFUQVszMToxNl0gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0QxNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDMwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChTRFJDX0NMSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfQ0xLCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzAKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRFFTMQorCisJLy8gUGxhY2UgdW51c2VkIERRIHBpbnMgaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRFFTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLyoKKwkgKiBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpCisJICoKKwkgKi8KKworCU1VWF9WQUwoQ1AoR1BNQ19BMSksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTEKKwlNVVhfVkFMKENQKEdQTUNfQTIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0EyCisJTVVYX1ZBTChDUChHUE1DX0EzKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMworCU1VWF9WQUwoQ1AoR1BNQ19BNCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTQKKwlNVVhfVkFMKENQKEdQTUNfQTUpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E1CisJTVVYX1ZBTChDUChHUE1DX0E2KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNgorCU1VWF9WQUwoQ1AoR1BNQ19BNyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTcKKworCS8vIFBsYWNlIHRoZSB1bnVzZWQgR1BNQ19BOCBwaW4gaW4gc2FmZSBtb2RlIChNb2RlIDcpLgorCisJTVVYX1ZBTChDUChHUE1DX0E4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gR1BNQ19BOSB0byBHUElPXzQyIHVzZWQgYXMgYSBwdXNoLXB1bGwsIGFjdGl2ZSBsb3cgaW5wdXQKKwkvLyBmcm9tIHRoZSBVU0IgUEhZIGZvciBVU0Igc3VzcGVuZCBub3RpZmljYXRpb24uCisKKwlNVVhfVkFMKENQKEdQTUNfQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBHUElPXzQyCisJTVVYX1ZBTChDUChHUE1DX0ExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJTVVYX1ZBTChDUChHUE1DX0QwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDEKKwlNVVhfVkFMKENQKEdQTUNfRDIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QyCisJTVVYX1ZBTChDUChHUE1DX0QzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMworCU1VWF9WQUwoQ1AoR1BNQ19ENCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDQKKwlNVVhfVkFMKENQKEdQTUNfRDUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q1CisJTVVYX1ZBTChDUChHUE1DX0Q2KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENgorCU1VWF9WQUwoQ1AoR1BNQ19ENyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDcKKwlNVVhfVkFMKENQKEdQTUNfRDgpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q4CisJTVVYX1ZBTChDUChHUE1DX0Q5KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOQorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMQorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMgorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxMworCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxNQorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MwCisJTVVYX1ZBTChDUChHUE1DX05DUzEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzEKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMgorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfTkNTNiB0byBHUFQxMV9QV01fRVZUIHVzZWQgYXMgYSBwdXNoLXB1bGwgcHVsc2Ugd2lkdGgKKwkvLyBtb2R1bGF0ZWQgKFBXTSkgc2lnbmFsIGZvciB0aGUgcGllem8uCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0zKSk7CS8vIEdQVDExX1BXTV9FVlQKKworCS8vIEFzc2lnbiBHUE1DX05DUzcgdG8gR1BJT181OCB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dAorCS8vIFBJRVpPX05FTkFCTEUgdG8gdGhlIFRJIFNONzRMVkMyRzI0MCBEdWFsIEJ1ZmZlci9Ecml2ZXIgV2l0aAorCS8vIDMtU3RhdGUgT3V0cHV0cyBpbnB1dHMuCisKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE00KSk7CS8vIEdQSU9fNTgKKworCU1VWF9WQUwoQ1AoR1BNQ19DTEspLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0NMSworCU1VWF9WQUwoQ1AoR1BNQ19OQURWX0FMRSksCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uQURWX0FMRQorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25PRQorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBHUE1DX25XRQorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQkUwX0NMRQorCisJLy8gQXNzaWduIEdQTUNfTkJFMSB0byBHUElPXzYxIHVzZWQgYXMgYSBwdXNoLXB1bGwgb3V0cHV0IHRvIHRoZQorCS8vIFppZ0JlZSBhY3RpdmUtbG93IHJlc2V0LgorCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzYxCisKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV1AKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX1dBSVQwCisJTVVYX1ZBTChDUChHUE1DX1dBSVQxKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMQorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVuYXZhaWxhYmxlCisKKwkvLyBBc3NpZ24gR1BNQ19XQUlUMyB0byBHUElPXzY1IHVzZWQgYXMgYW4gYWN0aXZlLWhpZ2gsIHB1c2gtcHVsbAorCS8vIGJhY2twbGF0ZSBkZXRlY3QgaW5wdXQuCisKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzY1CisKKwkvKgorCSAqIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpCisJICoKKwkgKiBBbGwgRFNTIHNpZ25hbHMgYXJlIHVzZWQgaW4gdGhlaXIgbm9ybWFsLCBkZWZhdWx0IG1vZGUgKE1vZGUgMCkKKwkgKiB0byBkcml2ZSB0aGUgU2Ftc3VuZyBMTVMzNTBERjBbMTNdIExDRCBkaXNwbGF5IHBhbmVsLgorCSAqLworCisJTVVYX1ZBTChDUChEU1NfUENMSyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19QQ0xLCisJTVVYX1ZBTChDUChEU1NfSFNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfSFNZTkMKKwlNVVhfVkFMKENQKERTU19WU1lOQyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19WU1lOQworCU1VWF9WQUwoQ1AoRFNTX0FDQklBUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19BQ0JJQVMKKwlNVVhfVkFMKENQKERTU19EQVRBMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExCisJTVVYX1ZBTChDUChEU1NfREFUQTIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIKKwlNVVhfVkFMKENQKERTU19EQVRBMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMworCU1VWF9WQUwoQ1AoRFNTX0RBVEE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE0CisJTVVYX1ZBTChDUChEU1NfREFUQTUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTUKKwlNVVhfVkFMKENQKERTU19EQVRBNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNgorCU1VWF9WQUwoQ1AoRFNTX0RBVEE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE3CisJTVVYX1ZBTChDUChEU1NfREFUQTgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTgKKwlNVVhfVkFMKENQKERTU19EQVRBOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBOQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTAKKwlNVVhfVkFMKENQKERTU19EQVRBMTEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTExCisJTVVYX1ZBTChDUChEU1NfREFUQTEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMgorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTMKKwlNVVhfVkFMKENQKERTU19EQVRBMTQpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE0CisJTVVYX1ZBTChDUChEU1NfREFUQTE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTYKKwlNVVhfVkFMKENQKERTU19EQVRBMTcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE3CisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExOAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTkKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIwCisJTVVYX1ZBTChDUChEU1NfREFUQTIxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjIKKwlNVVhfVkFMKENQKERTU19EQVRBMjMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIzCisKKwlNVVhfVkFMKENQKENBTV9XRU4pLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlciAvIFRyYW5zbWl0dGVyIChVQVJUKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKFVBUlQxX1RYKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gVUFSVDFfVFgKKwlNVVhfVkFMKENQKFVBUlQxX1JUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX1JUUworCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVUFSVDFfQ1RTCisJTVVYX1ZBTChDUChVQVJUMV9SWCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1JYCisJLyoKKwkgKiBDb250cm9sIGFuZCBEZWJ1ZworCSAqCisJICovCisKKwlNVVhfVkFMKENQKFNZU18zMkspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfMzJLCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDAKKwlNVVhfVkFMKENQKFNZU19CT09UMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMQorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QyCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDMKKwlNVVhfVkFMKENQKFNZU19CT09UNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q1CisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDYKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQxKSwgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBTWVNfQ0xLT1VUMQorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfblRSU1QKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UQ0sKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UTVMKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19UREkKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gSlRBR19FTVUxCisJTVVYX1ZBTChDUChFVEtfQ0xLX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfQ1RMX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDBfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDFfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDJfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDNfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDRfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDVfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDZfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDdfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDhfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDlfRVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEwX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDExX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEyX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChFVEtfRDEzX0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvLyBBc3NpZ24gRVRLX0QxWzQ1XSBhcyBNTTJfUlhSQ1YgYW5kIE1NMl9UWFNFMCBVU0IgRlMvTFMgSG9zdAorCS8vIChNb2RlIDUpCisKKwlNVVhfVkFMKENQKEVUS19EMTRfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfUlhSQ1YKKwlNVVhfVkFMKENQKEVUS19EMTVfRVMyKSwJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBNTTJfVFhTRTAKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXR1cCBmb3IgdGhlIE5lc3QgTGVhcm5pbmcKKyAqICAgICAgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIEl0IGluaGVyaXRzIGVudGlyZWx5IGZyb20gdGhlIGVxdWl2YWxlbnQgVEkgT01BUDMgRVZNCisgKglmaWxlLgorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8KKyAgICAgICAgYWRyICAgICByMCwgZ29fdG9fc3BlZWQgICAgICAgICAvKiBnZXQgYWRkciBvZiBjbG9jayBzZXR0aW5nIGNvZGUgKi8KKyAgICAgICAgbW92ICAgICByMiwgIzM4NCAgICAgICAgICAgICAgICAvKiByMiBzaXplIHRvIGNvcHkgKGRpdiBieSAzMiBieXRlcykgKi8KKyAgICAgICAgbW92ICAgICByMSwgcjEgICAgICAgICAgICAgICAgICAvKiByMSA8LSBkZXN0IGFkZHJlc3MgKHBhc3NlZCBpbikgKi8KKyAgICAgICAgYWRkICAgICByMiwgcjIsIHIwICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgKi8KK25leHQyOgorICAgICAgICBsZG1pYSAgIHIwISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisgICAgICAgIHN0bWlhICAgcjEhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKyAgICAgICAgY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworICAgICAgICBibmUgICAgIG5leHQyCisJbW92CXBjLCBsciAgICAgICAgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuCisqICAgSXQgY291bGQgYmUgcmVtb3ZlZCBpdHMgaXMga2VwdCBmb3IgY29tcGF0YWJpbHkgd2l0aCB1LWJvb3QuCisgKgorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gQ01fQ0xLRU5fUExMLWJ5cGFzcyB2YWx1ZQorICogIFIxID0gQ01fQ0xLU0VMMV9QTEwtbSwgbiwgYW5kIGRpdmlkZXIgdmFsdWVzCisgKiAgUjIgPSBDTV9DTEtTRUxfQ09SRS1kaXZpZGVyIHZhbHVlcworICogIFIzID0gQ01fSURMRVNUX0NLR0VOIC0gYWRkciBkcGxsIGxvY2sgd2FpdAorICoKKyAqICBOb3RlOiBJZiBjb3JlIHVubG9ja3MvcmVsb2NrcyBhbmQgU0RSQU0gaXMgcnVubmluZyBmYXN0IGFscmVhZHkgaXQgZ2V0cworICogICAgICAgIGNvbmZ1c2VkLiAgQSByZXNldCBvZiB0aGUgY29udHJvbGxlciBnZXRzIGl0IGJhY2suICBUYWtpbmcgYXdheSBpdHMKKyAqICAgICAgICBMMyB3aGVuIGl0cyBub3QgaW4gc2VsZiByZWZyZXNoIHNlZW1zIGJhZCBmb3IgaXQuICBOb3JtYWxseSwgdGhpcyBjb2RlCisgKiAgICAgICAgcnVucyBmcm9tIGZsYXNoIGJlZm9yZSBTRFIgaXMgaW5pdCBzbyB0aGF0IHNob3VsZCBiZSBvay4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDUgIC8qIGVtdSAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDUKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnNV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIGZsYXNoX2NmZzVfdmFsCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjIsIFtyNV0KKyAgICAgICAgb3JyICAgICByMiwgcjIsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbG9jayBEUExMMyBhbmQgd2FpdCBhIGJpdCAqLworICAgICAgICBvcnIgICAgIHIwLCByMCwgIzB4NyAgIC8qIHNldCB1cCBmb3IgbG9jayBtb2RlICovCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8KKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHMV8wKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUczXzApCitmbGFzaF9jZmczX3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHNF8wKQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzVfMCkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKyNlbmRpZiAvKiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAqLworCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4KKyAqIFRoZSB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBzeXNjbGsgYW5kIGZvciBFUzEgYW5kIEVTMi4KKyAqLworCittcHVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZFCisud29yZCAweDA3Cisud29yZCAweDA1Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxNzkKKy53b3JkIDB4MTIKKy53b3JkIDB4MDQKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MTkKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQQorLndvcmQgMHgzMgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfbXB1X2RwbGxfcGFyYW0KK2dldF9tcHVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIG1wdV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitpdmFfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4Cisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MEIKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRgorLndvcmQgMHgzMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgxNworLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCitjb3JlX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgwRQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgxMAorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE0QworLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDIxCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxCisud29yZCAweDEzCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKgorICogVGFibGVzIGZvciAzNngvMzd4IGRldmljZXMKKyAqCisgKiAoUG9wdWxhdGVkIGZvciAxM01IeiBvbmx5KQorICovCittcHVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF8zMDBNSFopCisud29yZCAxNTAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgMzAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDcsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAxNTAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAxNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikKKy53b3JkIDMwMCwgIDUsIDAsIDEgCS8vIDEyICAgTUh6Cisud29yZCA2MDAsIDEyLCAwLCAxIAkvLyAxMyAgIE1IegorLndvcmQgMTI1LCAgMywgMCwgMSAJLy8gMTkuMiBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDI2ICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIk1QVSBEUExMIHNldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEiCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfU1lTX01QVV9EUExMXzYwME1IWikgKi8KKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgIE0gICBOICAgRlMgTTIKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAxMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHoKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy8vICAgIE0gICAgTiAgIEZTIE0yCisjaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFopCisud29yZCAxMDAsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAyMDAsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAzNzUsIDM1LCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxMDAsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAzNzUsIDcxLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzMzMk1IWikKKy53b3JkIDE2NiwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDMzMiwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDQxNSwgMjMsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDE2NiwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDQxNSwgNDcsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKQorLndvcmQgMjAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgNDAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAxNywgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2Vsc2UKKyMgZXJyb3IgIkNvcmUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfNDAwTUhaKSAqLworCisvKgorICogRm9yIHRoZSBwZXJpcGhlcmFsIChQRVIpIChha2EgRFBMTDQpIGNsb2NrIHNldHRpbmdzLCB0aGVyZSBhcmUgb25seQorICogZWZmZWN0aXZlbHkgdHdvIGNsb2NrIGNob2ljZXMsIDk2IE1IeiBvciAxOTIgTUh6LiBIb3dldmVyLCB0aGUgb25seQorICogdGltZSAxOTIgTUh6IGlzIGFwdCB0byBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIGlzIGlmIGJvdGggU0dYIGFuZAorICogVFYgb3V0cHV0IGFyZSB1c2VkLgorICoKKyAqICAgRm9yIGFueSBnaXZlbiBzeXN0ZW0gY2xvY2ssIHRoZSBkaXZpZGVycyBhcmUgY29uZmlndXJlZCB0aHVzIChwZXIKKyAqICAgU2VjdGlvbiAzLjUuMy4zLjMuMiAiVHlwZSBCIERQTEwgKExvdy1KaXR0ZXIpIiBvZiB0aGUgT01BUDMgVFJNKToKKyAqCisgKiAgICAgUEVSW2Nsa291dF0gPSAoU1lTW2Nsa291dF0gKiBNKSAvIChOICsgMSkKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0yICAgICAgICAgICB1c2VkIGJ5IFVBUlQsIE1NQywgSTJDLCBldGMuCisgKiAgICAgICBNM1tjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE0zICAgICAgICAgICB1c2VkIGJ5IFRWIG91dC4KKyAqICAgICAgIE00W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTQgICAgICAgICAgIHVzZWQgYnkgRFNTLgorICogICAgICAgTTVbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNSAgICAgICAgICAgdXNlZCBieSBjYW1lcmEuCisgKiAgICAgICBNNltjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE02ICAgICAgICAgICB1c2VkIGJ5IGVtdWxhdGlvbi4KKyAqCisgKiAgU28sIGZvciBhIDE5LjIgTUh6IHN5c3RlbSBjbG9jayBhbmQgdGhlIHNjYWxhciBlbnRyaWVzIGJlbG93OgorICoKKyAqICAgICAgIFBFUltjbGtvdXRdID0gKDE5LjIgKiA1NDApIC8gKDExICsgMSkgPSA4NjQKKyAqCisgKiAgICAgICBNMltjbGtvdXRdOiA4NjQgLyAgOSA9ICA5NiAgIE1IegorICogICAgICAgTTNbY2xrb3V0XTogODY0IC8gMTYgPSAgNTQgICBNSHoKKyAqICAgICAgIE00W2Nsa291dF06IDg2NCAvICA1ID0gMTcyLjggTUh6CisgKiAgICAgICBNNVtjbGtvdXRdOiA4NjQgLyAgNCA9IDIxNiAgIE1IegorICogICAgICAgTTZbY2xrb3V0XTogODY0IC8gIDMgPSAyODggICBNSHoKKyAqLworcGVyXzM2eF9kcGxsX3BhcmFtOgorLy8gICAgU1lTX0NMSyAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWCisud29yZCAxMjAwMCwgICAgNDMyLCAgICA1LCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTIgICBNSHoKKy53b3JkIDEzMDAwLCAgICA4NjQsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxMyAgIE1IegorLndvcmQgMTkyMDAsICAgIDU0MCwgICAxMSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE5LjIgTUh6Cisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMjYgICBNSHoKKy53b3JkIDM4NDAwLCAgICAyNzAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAzOC40IE1IegorLndvcmQgMTY4MDAsICAgIDM2MCwgICAgNiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDE2LjggTUh6CisKKy5nbG9ibCBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtCitnZXRfMzZ4X21wdV9kcGxsX3BhcmFtOgorCWFkcglyMCwgbXB1XzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbQorZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGl2YV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfY29yZV9kcGxsX3BhcmFtCitnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIGNvcmVfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtCitnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtOgorCWFkcglyMCwgcGVyXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5oIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGMxMmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yCisgKiAgICAgIGFjY2Vzc2luZyBEaWdpdGFsIFBoYXNlZCBMb2NrIExvb3AgKERQTEwpIHBhcmFtZXRlcnMgYW5kCisgKiAgICAgIHNldHRpbmdzLgorICoKKyAqLworCisjaWZuZGVmIF9ORVNUX0o0OV9QTEFURk9STV9IXworI2RlZmluZSBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKworI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qCisgKiBUeXBlIERlZmluaXRpb25zCisgKi8KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisJdTMyIG07CisJdTMyIG47CisJdTMyIGZzZWw7CisJdTMyIG0yOworfTsKKworc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSB7CisJdTMyIHN5c19jbGs7CisJdTMyIG07CisJdTMyIG47CisJdTMyIG0yOworCXUzMiBtMzsKKwl1MzIgbTQ7CisJdTMyIG01OworCXUzMiBtNjsKKwl1MzIgbTJkaXY7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKy8qCisgKiBJbmxpbmUgRnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZGVsYXkodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJICAiYm5lIDFiIjoiPXIiIChsb29wcyk6IjAiKGxvb3BzKSk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIFByb3RvdHlwZXMKKyAqCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBwbGF0Zm9ybS5TLgorICovCisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfaXZhX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbSh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9ORVNUX0o0OV9QTEFURk9STV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wcmNtLmMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDktdXNiLWxvYWRlci9wcmNtLmMKQEAgLTAsMCArMSw1NjUgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBib2FyZC1zcGVjaWZpYyBzZXQtdXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQsIGJhc2VkIG9uIHRoZSBUSSBPTUFQMyBBTTM3MDNDVVMsIGZvY3VzaW5nCisgKiAgICAgIHByaW1hcmlseSBjbG9jayBzZXQtdXAgZm9yIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kCisgKiAgICAgIENsb2NrIE1hbmFnZXIgKFBSQ00pCisgKgorICogICAgICBUaGlzIGlzIG9yaWdpbmFsbHkgaW5oZXJpdGVkIGFuZCBzcGxpdCBmcm9tIHRoZSBPTUFQMyBFVk0KKyAqICAgICAgYm9hcmQgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisvKgorICogIHUzMiBnZXRfb3NjX2Nsa19zcGVlZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgdGhlIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkIGJhc2VkIG9uCisgKiAgICBhIGtub3duIDMyIGtIeiBjbG9jayBhbmQgZ2VuZXJhbCBwdXJwb3NlIHRpbWVyLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBjbG9jayBzcGVlZC4KKyAqCisgKi8KK3N0YXRpYyB1MzIKK2dldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCBjZGl2LCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCisJaWYgKHZhbCAmIEJJVDcpCisJCWNkaXYgPSAyOworCWVsc2UgaWYgKHZhbCAmIEJJVDYpCisJCWNkaXYgPSAxOworCWVsc2UKKwkJLyoKKwkJICogU2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUhCisJCSAqIFRCRDogQWRkIGEgV0FSTigpL0JVRygpCisJCSAqICAgICAgRm9yIG5vdywgYXNzdW1lIGRpdmlkZXIgYXMgMS4KKwkJICovCisJCWNkaXYgPSAxOworCisJLyogZW5hYmxlIHRpbWVyMiAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0NMS1NFTF9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMX1dLVVApOwkvKiBzZWxlY3Qgc3lzX2NsayBmb3IgR1BUMSAqLworCisJLyogRW5hYmxlIEkgYW5kIEYgQ2xvY2tzIGZvciBHUFQxICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fSUNMS0VOX1dLVVApIHwgQklUMCB8IEJJVDI7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fSUNMS0VOX1dLVVApOworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTl9XS1VQKSB8IEJJVDA7CisJX19yYXdfd3JpdGVsKHZhbCwgQ01fRkNMS0VOX1dLVVApOworCisJX19yYXdfd3JpdGVsKDAsIE9NQVAzNFhYX0dQVDEgKyBUTERSKTsJLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworCV9fcmF3X3dyaXRlbChHUFRfRU4sIE9NQVAzNFhYX0dQVDEgKyBUQ0xSKTsgICAgIC8qIGVuYWJsZSBjbG9jayAqLworCS8qIGVuYWJsZSAzMmtIeiBzb3VyY2UgKi8vKiBlbmFibGVkIG91dCBvZiByZXNldCAqLworCS8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisKKwlzdGFydCA9IDIwICsgX19yYXdfcmVhZGwoUzMyS19DUik7CS8qIHN0YXJ0IHRpbWUgaW4gMjAgY3ljbGVzICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgc3RhcnQpOwkvKiBkZWFkIGxvb3AgdGlsbCBzdGFydCB0aW1lICovCisJY3N0YXJ0ID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCArIDIwKSk7CS8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworCWNlbmQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworCWNkaWZmID0gY2VuZCAtIGNzdGFydDsJCQkJLyogZ2V0IGVsYXBzZWQgdGlja3MgKi8KKworCWlmIChjZGl2ID09IDIpCisJeworCQljZGlmZiAqPSAyOworCX0KKworCS8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKwlpZiAoY2RpZmYgPiAxOTAwMCkKKwkJcmV0dXJuIChTMzhfNE0pOworCWVsc2UgaWYgKGNkaWZmID4gMTUyMDApCisJCXJldHVybiAoUzI2TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxMzAwMCkKKwkJcmV0dXJuIChTMjRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDkwMDApCisJCXJldHVybiAoUzE5XzJNKTsKKwllbHNlIGlmIChjZGlmZiA+IDc2MDApCisJCXJldHVybiAoUzEzTSk7CisJZWxzZQorCQlyZXR1cm4gKFMxMk0pOworfQorCisvKgorICogIHZvaWQgZ2V0X3N5c19jbGtpbl9zZWwoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBzZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIFBSQ00gUFJNIHN5c3RlbSBjbG9jaworICogICAgZnJlcXVlbmN5IHNlbGVjdG9yLCB3aGljaCBzaG91bGQgYmUgd3JpdHRlbiB0byBQUk1fQ0xLU0VMLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGhlcnR6ICAtIFRoZSBzcGVlZCwgaW4gTUh6LCB0aGF0IHRoZSBzeXN0ZW0gY2xvY2sgaXMgYmVsaWV2ZWQKKyAqICAgICAgICAgICAgICAgdG8gYmUgcnVubmluZyBhdC4KKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIGluZGV4IHVzZWQgdG8gYWNjZXNzIHRoZQorICogICAgICAgICAgICAgICBkaWdpdGFsIFBMTCBzZXR0aW5ncy4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgc3lzX2Nsa2luX3NlbCAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggZm9yIHRoZSBkaWdpdGFsIFBMTCBzZXR0aW5ncworICogICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIHNwZWNpZmllZCBzeXN0ZW0gY2xvY2sgcmF0ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLworc3RhdGljIHZvaWQKK2dldF9zeXNfY2xraW5fc2VsKHUzMiBoZXJ0eiwgdTMyICpzeXNfY2xraW5fc2VsKQoreworCXN3aXRjaCAoaGVydHopIHsKKworCWNhc2UgUzM4XzRNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMyNk06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzI2XzBfTUhaOworCQlicmVhazsKKworCWNhc2UgUzE5XzJNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxNl84TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTZfOF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTNNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxMk06CisJZGVmYXVsdDoKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTJfMF9NSFo7CisJCWJyZWFrOworCisJfQorfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM0WCk7CS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCisJLyogRlJFUVNFTCAoQ09SRV9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDQsIDQsIHB0ci0+ZnNlbCk7CisJc3IzMihDTV9DTEtFTl9QTEwsICAgMCwgMywgUExMX0xPQ0spOwkJLyogbG9jayBtb2RlICovCisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2RwbGw0X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyID0gcHRyICsgY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CQkvKiBzZXQgTTYgKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDUsIFBFUl9NNVgyKTsJCS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CQkvKiBzZXQgTTMgKi8KKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKFBFUklQSF9EUExMX0ZSRVFTRUwpOiBDTV9DTEtFTl9QTExbMjA6MjNdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCkgOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCittcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIEZSRVFTRUwgKElWQTJfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCA0LCA0LCBwdHItPmZzZWwpOworCisJLyogTE9DSyBNT0RFIChFTl9JVkEyX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsKKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworfQorCisvKgorICogT01BUDM2MzAgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkCitkcGxsM19pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogQ09SRSBEUExMICovCisJLyogU2VsZWN0IHJlbG9jayBieXBhc3M6IENNX0NMS0VOX1BMTFswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogQ01fQ0xLU0VMMV9FTVVbRElWX0RQTEwzXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDE2LCA1LCBDT1JFX00zWDIpOworCisJLyogTTIgKENPUkVfRFBMTF9DTEtPVVRfRElWKTogQ01fQ0xLU0VMMV9QTExbMjc6MzFdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMjcsIDUsIHB0ci0+bTIpOworCisJLyogTSAoQ09SRV9EUExMX01VTFQpOiBDTV9DTEtTRUwxX1BMTFsxNjoyNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAxNiwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChDT1JFX0RQTExfRElWKTogQ01fQ0xLU0VMMV9QTExbODoxNF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBwdHItPm4pOworCisJLyogU291cmNlIGlzIHRoZSBDTV85Nk1fRkNMSzogQ01fQ0xLU0VMMV9QTExbNl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA2LCAxLCAwKTsKKworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisKKwlzcjMyKENNX0NMS1NFTF9HRlgsICAwLCAzLCBHRlhfRElWXzM2WCk7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzZ4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X21wdV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAoMipjbGtfaW5kZXgpICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogTE9DSyBNT0RFIChFTl9NUFVfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK2l2YV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIElWQSBEUExMICovCisJLyogRU5fSVZBMl9EUExMIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKworCS8qIE0yIChJVkEyX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9JVkEyWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoSVZBMl9EUExMX01VTFQpIDogQ01fQ0xLU0VMMV9QTExfSVZBMls4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChJVkEyX0RQTExfRElWKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqICB2b2lkIHByY21faW5pdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGNsb2NrcyBpbiBhIGJvYXJkLXNwZWNpZmljIG1hbm5lciBmb3IKKyAqICAgIHRoZSBwcm9jZXNzb3IncyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZXIgKFBSQ00pIGFuZCBpcworICogICAgY2FsbGVkIG9ubHkgd2hlbiBhbiBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubworICogICAgU0RSQU0pLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIHN5c19jbGtfcmF0ZSA9IDAsIHN5c19jbGtpbl9zZWwsIHN5c19jbGtfZGl2OworCXUzMiBjbGtfaW5kZXgsIHNpbF9pbmRleDsKKworCS8qIEdhdWdlIHRoZSBpbnB1dCBjbG9jayBzcGVlZCBhbmQgZmluZCBvdXQgdGhlIHN5c19jbGtpbl9zZWwKKwkgKiB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBjbG9jay4KKwkgKi8KKwlzeXNfY2xrX3JhdGUgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKHN5c19jbGtfcmF0ZSwgJnN5c19jbGtpbl9zZWwpOworCisJLyogU2V0IHRoZSBQUk1fQ0xLU0VMX1NZU19DTEtJTl9TRUwgdmFsdWUgaW4gdGhlIHByb2Nlc3Nvci4gKi8KKworCXNyMzIoUFJDTV9QUk1fQ0NSX0NMS1NFTCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9TVEFSVCwKKwkJIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTLAorCQkgc3lzX2Nsa2luX3NlbCk7CisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUgYnkgdHdvLgorCSAqCisJICogT24gT01BUDM2MzAsIEREUiBkYXRhIGNvcnJ1cHRpb24gaGFzIGJlZW4gb2JzZXJ2ZWQgb24gT0ZGIG1vZGUKKwkgKiBleGl0IGlmIHRoZSBzeXMgY2xvY2sgd2FzIGxvd2VyIHRoYW4gMjZNLiBBcyBhIHdvcmsgYXJvdW5kLAorCSAqIE9NQVAzNjMwIGlzIG9wZXJhdGVkIGF0IDI2TSBzeXMgY2xvY2sgYW5kIHRoaXMgaW50ZXJuYWwgZGl2aXNpb24KKwkgKiBpcyBub3QgcGVyZm9ybWVkLgorCSAqLworCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmCisJICAgKHN5c19jbGtpbl9zZWwgPiBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFopKSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzI7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAyOworCisJfSBlbHNlIHsKKwkJc3lzX2Nsa19kaXYgPSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMTsKKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbCAvIDE7CisKKwl9CisKKwlzcjMyKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMLAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX1NUQVJULAorCQkgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JJVFMsCisJCSBzeXNfY2xrX2Rpdik7CisKKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlkcGxsM19pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCisJfSBlbHNlIHsKKwkJc2lsX2luZGV4ID0gZ2V0X2NwdV9yZXYoKSAtIDE7CisKKwkJLyogVGhlIERQTEwgdGFibGVzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBzeXNjbGsgdmFsdWUgYW5kCisJCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCQkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJCSAqIGFuZCBzaWxfaW5kZXggd2lsbCBnZXQgdGhlIHZhbHVlcyBmb3IgdGhhdCBTeXNDbGsgZm9yIHRoZQorCQkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkJICovCisKKwkJLyogVW5sb2NrIE1QVSBEUExMIChzbG93cyB0aGluZ3MgZG93biwgYW5kIG5lZWRlZCBsYXRlcikgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9XX1BPV0VSX0JZUEFTUyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkJZHBsbDNfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJZHBsbDRfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJaXZhX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCW1wdV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCisJCS8qIExvY2sgTVBVIERQTEwgdG8gc2V0IGZyZXF1ZW5jeSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKwl9CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS11c2ItbG9hZGVyL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5LXVzYi1sb2FkZXIveC1sb2FkLmxkcwpAQCAtMCwwICsxLDY1IEBACisvKgorICoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICogICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGlzIHRoZSBYLUxvYWRlciBsaW5rZXIgc2NhdHRlciBmaWxlIGZvciB0aGUgTmVzdAorICogICAgICBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqLworCisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZQorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2U0YTkwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlIGZpbGUgZm9yIHBvcnRpb25zIG9mIFgtTG9hZGVyIHNwZWNpZmljCisjICAgICAgdG8gdGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyMKKworIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworQ09CSlMJOj0gajQ5Lm8gbXV4Lm8gcHJjbS5vCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKK0NQUEZMQUdTICs9IC1JJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpCisKK1NSQ1MgICAgOj0gJChTT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMgICAgOj0gJChhZGRwcmVmaXggJChvYmopLCQoQ09CSlMpKQorU09CSlMgICA6PSAkKGFkZHByZWZpeCAkKG9iaiksJChTT0JKUykpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKFNPQkpTKSAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFNPQkpTKSAkKE9CSlMpCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOiAgY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9jb25maWcubWsgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxMzgwYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2NvbmZpZy5tawpAQCAtMCwwICsxLDIxIEBACisKKworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBPTUFQM0VWTSBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzIworIworIyBPTUFQM0VWTSBoYXMgMSBiYW5rIG9mIDEyOE1CIG1QT1AtU0RSQU0gb24gQ1MwCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisKKyMgRm9yIHVzZSBpZiB5b3Ugd2FudCBYLUxvYWRlciB0byByZWxvY2F0ZSBmcm9tIFNSQU0gdG8gRERSCisjVEVYVF9CQVNFID0gMHg4MGU4MDAwMAorCisjIEZvciBYSVAgaW4gNjRLIG9mIFNSQU0gb3IgZGVidWcgKEdQIGRldmljZSBoYXMgaXQgYWxsIGF2YWlsYWJlKQorIyBTUkFNIDQwMjAwMDAwLTQwMjBGRkZGIGJhc2UKKyMgaW5pdGlhbCBzdGFjayBhdCAweDQwMjBmZmZjIHVzZWQgaW4gc19pbml0IChiZWxvdyB4bG9hZGVyKS4KKyMgVGhlIHJ1biB0aW1lIHN0YWNrIGlzIChhYm92ZSB4bG9hZGVyLCAyayBiZWxvdykKKyMgSWYgYW55IGdsb2JhbHMgZXhpc3QgdGhlcmUgbmVlZHMgdG8gYmUgcm9vbSBmb3IgdGhlbSBhbHNvCitURVhUX0JBU0UgPSAweDQwMjAwODAwCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9qNDkuYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L2o0OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MzRjNTAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9qNDkuYwpAQCAtMCwwICsxLDEwNDYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICAoQykgQ29weXJpZ2h0IDIwMDYKKyAqICAgIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqICAgIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQUNVUywgZm9jdXNpbmcKKyAqICAgICAgcHJpbWFyaWx5IG9uIEdQSU8sIFJBTSBhbmQgZmxhc2ggaW5pdGlhbGl6YXRpb24uCisgKgorICogICAgICBUaGlzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBPTUFQMyBFVk0gZXF1aXZhbGVudCBmaWxlLgorICoKKyAqICAgICAgSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gb3JkZXIgaXMgcm91Z2hseToKKyAqCisgKiAgICAgICAgMSkgc19pbml0CisgKiAgICAgICAgMikgYm9hcmRfaW5pdAorICogICAgICAgIDMpIG1pc2NfaW5pdF9yCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKyNkZWZpbmUgTUFYX0o0OV9CT09UX0RFVklDRVMgKDMpCisKK3ZvaWQKK3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKSB7CisJZGVsYXkodXNlY3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorZ2V0X2NwdV9pZCh2b2lkKQoreworCXUzMiBjcHVpZCA9IDA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKworCXJldHVybiAoY3B1aWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitnZXRfY3B1X3Jldih2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCWlmICgoY3B1aWQgICYgMHhmKSA9PSAweDApIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzEpOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIChDUFVfMzQzMF9FUzIpOworCisJfQorCit9CisKK3UzMgoraXNfY3B1X2ZhbWlseSh2b2lkKQoreworCWNvbnN0IHUzMiBjcHVpZCA9IGdldF9jcHVfaWQoKTsKKwl1MzIgY3B1X2ZhbWlseSA9IDAsIG9tYXAzNHh4X2lkID0gMDsKKwl1MTYgaGF3a2V5ZTsKKworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCisJfSBlbHNlIHsKKwkJb21hcDM0eHhfaWQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9DT05UUk9MX0lEKTsKKwkJaGF3a2V5ZSAgPSAob21hcDM0eHhfaWQgPj4gSEFXS0VZRV9TSElGVCkgJiAweGZmZmY7CisKKwkJc3dpdGNoIChoYXdrZXllKSB7CisKKwkJY2FzZSBIQVdLRVlFX0FNMzVYWDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJYnJlYWs7CisKKwkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJY3B1X2ZhbWlseSA9IENQVV9PTUFQMzZYWDsKKwkJCWJyZWFrOworCisJCWNhc2UgSEFXS0VZRV9PTUFQMzRYWDoKKwkJZGVmYXVsdDoKKwkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQlicmVhazsKKworCQl9CisJfQorCisJcmV0dXJuIChjcHVfZmFtaWx5KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNwdV9pc18zNDEwKHZvaWQpIC0gcmV0dXJucyB0cnVlIGZvciAzNDEwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyCitjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiAgdm9pZCBzcjMyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgY2xlYXJzIGFuZCBzZXRzIGEgdmFsdWUgaW4gYSBiaXQgZXh0ZW50IGZvciBhCisgKiAgICAzMi1iaXQgdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIGF0IHdoaWNoIHRvIGNsZWFyIGFuZCBzZXQgdGhlIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgc3BlY2lmaWVkIDMyLWJpdCB2YWx1ZS4KKyAqICAgIHN0YXJ0X2JpdCAtIFRoZSBmaXJzdCBiaXQgb2YgdGhlIDMyLWJpdCBkYXRhIHRvIGNsZWFyIGFuZCBzZXQuCisgKiAgICBudW1fYml0cyAgLSBUaGUgcmFuZ2Ugb2YgYml0cyBvZiB0aGUgMzItYml0IGRhdGEgdG8gY2xlYXIgYW5kIHNldC4KKyAqICAgIHZhbHVlICAgICAtIFRoZSB2YWx1ZSB0byBzZXQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGFkZHIgICAgICAtIFRoZSBhZGRyZXNzIHdpdGggdGhlIHNwZWNpZmllZCBiaXQgZXh0ZW50IGNsZWFyZWQgYW5kCisgKiAgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKworCW1zayA9ICgxIDw8IG51bV9iaXRzKTsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qCisgKiAgdTMyIHdhaXRfb25fdmFsdWUoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZWFkcyB0aGUgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIGFuZAorICogICAgYnVzeSB3YWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIG1hdGNoIHZhbHVlIGlzIHJlYWQgb3IgdW50aWwgdGhlCisgKiAgICBib3VuZGVkIG51bWJlciBvZiBsb29wcyBoYXZlIGJlZW4gcmVhY2hlZC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICByZWFkX2JpdF9tYXNrIC0gVGhlIGJpdCBtYXNrIHRvIGFwcGx5IGFmdGVyIHJlYWRpbmcgdGhlIHJlZ2lzdGVyLgorICogICAgbWF0Y2hfdmFsdWUgICAtIFRoZSB2YWx1ZSB0byBtYXRjaCBvbiBhZnRlciByZWFkaW5nIGFuZCBtYXNraW5nLgorICogICAgcmVhZF9hZGRyICAgICAtIFRoZSByZWdpc3RlciBhZGRyZXNzIHRvIHJlYWQuCisgKiAgICBib3VuZCAgICAgICAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIHJlYWQgYmVmb3JlIGdpdmluZworICogICAgICAgICAgICAgICAgICAgIHVwLgorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRydWUgKDEpIGlmIHRoZSBtYXRjaF92YWx1ZSB3YXMgcmVhY2hlZDsgb3RoZXJ3aXNlLCBmYWxzZSAoMCkuCisgKgorICovCit1MzIKK3dhaXRfb25fdmFsdWUodTMyIHJlYWRfYml0X21hc2ssIHUzMiBtYXRjaF92YWx1ZSwgdTMyIHJlYWRfYWRkciwgdTMyIGJvdW5kKQoreworCXUzMiBpID0gMCwgdmFsOworCWRvIHsKKwkJKytpOworCQl2YWwgPSBfX3Jhd19yZWFkbChyZWFkX2FkZHIpICYgcmVhZF9iaXRfbWFzazsKKwkJaWYgKHZhbCA9PSBtYXRjaF92YWx1ZSkKKwkJCXJldHVybiAoMSk7CisJCWlmIChpID09IGJvdW5kKQorCQkJcmV0dXJuICgwKTsKKwl9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK3RyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJY29uc3QgaW50IHR5cGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKworCS8qCisJICogSWYgdGhlIHByb2Nlc3NvciBpcyBhIEdQIGRldmljZSwgdW5sb2NrIHRoZSBkZXZpY2UgU1JBTSBmb3IKKwkgKiBnZW5lcmFsIHVzZS4KKwkgKi8KKworCWlmICh0eXBlID09IENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1ApIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKworCXJldHVybjsKK30KKworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKQorc3RhdGljIHZvaWQKK29tYXAzX3NkcmNfcmVnaXN0ZXJfZHVtcCh2b2lkKQoreworICAgIHByaW50ZigiXG4gIFNEUkMgUmVnaXN0ZXIgRHVtcDpcbiIpOworCisJRFVNUF9SRUdMKFNEUkNfUkVWSVNJT04pOworCURVTVBfUkVHTChTRFJDX1NZU0NPTkZJRyk7CisJRFVNUF9SRUdMKFNEUkNfU1lTU1RBVFVTKTsKKwlEVU1QX1JFR0woU0RSQ19DU19DRkcpOworCURVTVBfUkVHTChTRFJDX1NIQVJJTkcpOworCURVTVBfUkVHTChTRFJDX0VSUl9BRERSKTsKKwlEVU1QX1JFR0woU0RSQ19FUlJfVFlQRSk7CisJRFVNUF9SRUdMKFNEUkNfRExMQV9DVFJMKTsKKwlEVU1QX1JFR0woU0RSQ19ETExBX1NUQVRVUyk7CisJRFVNUF9SRUdMKFNEUkNfUE9XRVJfUkVHKTsKKwlEVU1QX1JFR0woU0RSQ19NQ0ZHXzApOworCURVTVBfUkVHTChTRFJDX01SXzApOworCURVTVBfUkVHTChTRFJDX0VNUjJfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJRFVNUF9SRUdMKFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJRFVNUF9SRUdMKFNEUkNfUkZSX0NUUkxfMCk7CisJRFVNUF9SRUdMKFNEUkNfTUFOVUFMXzApOworCURVTVBfUkVHTChTRFJDX01DRkdfMSk7CisJRFVNUF9SRUdMKFNEUkNfTVJfMSk7CisJRFVNUF9SRUdMKFNEUkNfRU1SMl8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlEVU1QX1JFR0woU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwlEVU1QX1JFR0woU0RSQ19SRlJfQ1RSTF8xKTsKKwlEVU1QX1JFR0woU0RSQ19NQU5VQUxfMSk7Cit9CisjZWxzZQorIyBkZWZpbmUgb21hcDNfc2RyY19yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX1NEUkFNX0RFQlVHKSAqLworCisjaWYgZGVmaW5lZChDRkdfR1BNQ19ERUJVRykKK3N0YXRpYyB2b2lkCitvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAodm9pZCkKK3sKKyAgICBwcmludGYoIlxuICBHUE1DIFJlZ2lzdGVyIER1bXA6XG4iKTsKKworCURVTVBfUkVHTChHUE1DX1JFVklTSU9OKTsKKwlEVU1QX1JFR0woR1BNQ19TWVNDT05GSUcpOworCURVTVBfUkVHTChHUE1DX1NZU1NUQVRVUyk7CisJRFVNUF9SRUdMKEdQTUNfSVJRU1RBVFVTKTsKKwlEVU1QX1JFR0woR1BNQ19JUlFFTkFCTEUpOworCURVTVBfUkVHTChHUE1DX1RJTUVPVVRfQ09OVFJPTCk7CisJRFVNUF9SRUdMKEdQTUNfRVJSX0FERFJFU1MpOworCURVTVBfUkVHTChHUE1DX0VSUl9UWVBFICk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHICk7CisJRFVNUF9SRUdMKEdQTUNfU1RBVFVTICk7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzApOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8wKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzApOworCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8xKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzEpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfMSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN18xKTsKKworCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF8yKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzIpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfMik7CisKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM18zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzMpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfMyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl8zKTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzMpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF80KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzQpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNCk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN180KTsKKwkJCSAgICAgICAgICAgICAgIAorCURVTVBfUkVHTChHUE1DX0NPTkZJRzFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMl81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUczXzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzRfNSk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNV81KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc2XzUpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzdfNSk7CisJCQkgICAgICAgICAgICAgICAKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcxXzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzJfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHM182KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc0XzYpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzVfNik7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNl82KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc3XzYpOworCQkJICAgICAgICAgICAgICAgCisJRFVNUF9SRUdMKEdQTUNfQ09ORklHMV83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUcyXzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzNfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHNF83KTsKKwlEVU1QX1JFR0woR1BNQ19DT05GSUc1XzcpOworCURVTVBfUkVHTChHUE1DX0NPTkZJRzZfNyk7CisJRFVNUF9SRUdMKEdQTUNfQ09ORklHN183KTsKKworI2lmIDAKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzEpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF8yKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfMyk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzQpOworCURVTVBfUkVHTChHUE1DX05BTkRfQ09NTUFORF81KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0NPTU1BTkRfNik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9DT01NQU5EXzcpOworCisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzApOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU18xKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfMik7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzMpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU180KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0FERFJFU1NfNSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9BRERSRVNTXzYpOworCURVTVBfUkVHTChHUE1DX05BTkRfQUREUkVTU183KTsKKworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8wKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfMSk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzIpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV8zKTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNCk7CisJRFVNUF9SRUdMKEdQTUNfTkFORF9EQVRBXzUpOworCURVTVBfUkVHTChHUE1DX05BTkRfREFUQV82KTsKKwlEVU1QX1JFR0woR1BNQ19OQU5EX0RBVEFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcxKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05GSUcyKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9DT05UUk9MKTsKKwlEVU1QX1JFR0woR1BNQ19QUkVGRVRDSF9TVEFUVVMpOworCisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTkZJRyk7CisJRFVNUF9SRUdMKEdQTUNfRUNDX0NPTlRST0wpOworCURVTVBfUkVHTChHUE1DX0VDQ19TSVpFX0NPTkZJRyk7CisKKwlEVU1QX1JFR0woR1BNQ19FQ0MxX1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDMl9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzNfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M0X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDNV9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzZfUkVTVUxUKTsKKwlEVU1QX1JFR0woR1BNQ19FQ0M3X1JFU1VMVCk7CisJRFVNUF9SRUdMKEdQTUNfRUNDOF9SRVNVTFQpOworCURVTVBfUkVHTChHUE1DX0VDQzlfUkVTVUxUKTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQwXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfMyk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNCk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNSk7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNik7CisJRFVNUF9SRUdMKEdQTUNfQkNIX1JFU1VMVDFfNyk7CisKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8wKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8xKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8yKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl8zKTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl80KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl81KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl82KTsKKwlEVU1QX1JFR0woR1BNQ19CQ0hfUkVTVUxUMl83KTsKKworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzApOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzEpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzIpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzMpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzQpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzUpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzYpOworCURVTVBfUkVHTChHUE1DX0JDSF9SRVNVTFQzXzcpOworCisJRFVNUF9SRUdMKEdQTUNfQkNIX1NXREFUQSk7CisjZW5kaWYKK30KKyNlbHNlCisjIGRlZmluZSBvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9ERUJVRykgKi8KKworI2lmIGRlZmluZWQoQ0ZHX1BSQ01fREVCVUcpCitzdGF0aWMgdm9pZAorb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKHZvaWQpCit7CisgICAgcHJpbnRmKCJcbiAgUFJDTSBSZWdpc3RlciBEdW1wOlxuIik7CisKKwlEVU1QX1JFR0woUFJDTV9QUk1fQ0NSX0NMS1NFTCk7CisJRFVNUF9SRUdMKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTEwpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTCk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDNfUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMl9QTExfTVBVKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX01QVSk7CisJRFVNUF9SRUdMKENNX0NMS1NFTDFfUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUwyX1BMTF9JVkEyKTsKKwlEVU1QX1JFR0woQ01fQ0xLRU5fUExMX0lWQTIpOworCURVTVBfUkVHTChDTV9DTEtTRUxfQ0FNKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMX0NPUkUpOworCURVTVBfUkVHTChDTV9DTEtTRUxfRFNTKTsKKwlEVU1QX1JFR0woQ01fQ0xLU0VMMV9FTVUpOworfQorI2Vsc2UKKyNkZWZpbmUgb21hcDNfcHJjbV9yZWdpc3Rlcl9kdW1wKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIENGR19QUkNNX0RFQlVHICovCisKKy8qCisgKiAgdm9pZCBjb25maWdfZGlhbW9uZF9zZHJhbSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBwcm9jZXNzb3IncyBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorICogICAgYXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiAzMiBNYiB4IDE2IGIgKDY0CisgKiAgICBNaUIpIEREUiBTRFJBTSBvbiB0aGUgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IGJvYXJkLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIE4vQQorICoKKyAqLwordm9pZAorY29uZmlnX2RpYW1vbmRfc2RyYW0odm9pZCkKK3sKKwl1MzIgdmFsdWUsIGFjdGltX2N0cmxhLCBhY3RpbV9jdHJsYjsKKworCS8qCisJICogU3RlcCAxOiBSZXNldCB0aGUgU0RSQyBjb250cm9sbGVyIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSByZXNldAorCSAqIGV2ZW50IHRvIGNsZWFyLgorCSAqLworCisgICAgX19yYXdfd3JpdGVsKFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9TRVQsIFNEUkNfU1lTQ09ORklHKTsKKyAgICB3YWl0X29uX3ZhbHVlKFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1lTU1RBVFVTX1JFU0VURE9ORSwKKwkJCQkgIFNEUkNfU1RBVFVTLAorCQkJCSAgMTIwMDAwMDApOworICAgIF9fcmF3X3dyaXRlbChTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfQ0xFQVIsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qCisJICogU3RlcCAyOiBTZXR1cCB0aGUgcG9zaXRpb24gYW5kIGdlb21ldHJ5IG9mIHRoZSBTRFJBTSBkZXZpY2Ugb24KKwkgKiB0aGUgY29udHJvbGxlcidzIGJ1cy4KKwkgKi8KKworCXZhbHVlID0KKwkJKFNEUkNfU0hBUklOR19MT0NLX09GRiAJCQkJCQkJCQkJCQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0VOQ09ERShTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHXzE2X0JJVF8xNl8wKQl8CisJCSBTRFJDX1NIQVJJTkdfU0RSQ1RSSVNUQVRFX09GRik7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX1NIQVJJTkcpOworCisJLyoKKwkgKiBTdGVwIDM6IFNldHVwIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIFJBUyB3aWR0aCwKKwkgKiBDQVMgd2lkdGgsIGFkZHJlc3MgbXVsdGlwbGV4aW5nLCBzaXplLCBiYW5rIG1hcHBpbmcsIGJ1cyB3aWR0aCwKKwkgKiBwb3dlciBtb2RlLCBERFIgdHlwZSBhbmQgbWVtb3J5IHR5cGUuCisJICovCisKKwl2YWx1ZSA9CisJCShTRFJDX01DRkdfTE9DS1NUQVRVU19SVwkJCQkJCQkJCQl8CisJCSBTRFJDX01DRkdfUkFTV0lEVEhfRU5DT0RFKFNEUkNfTUNGR19SQVNXSURUSF8xNF9CSVRTKQkJCXwKKwkJIFNEUkNfTUNGR19DQVNXSURUSF9FTkNPREUoU0RSQ19NQ0ZHX0NBU1dJRFRIXzEwX0JJVFMpCQkJfAorCQkgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRkxFWElCTEUJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19SQU1TSVpFX0VOQ09ERShDRkdfU0RSQU1fU0laRV9NQikJCQkJCXwKKwkJIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9FTkNPREUoU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX1JfQl9DKXwKKwkJIFNEUkNfTUNGR19CMzJOT1QxNl9PRkYJCQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERUVQUERfU1VQUE9SVEVECQkJCQkJCQkJCXwKKwkJIFNEUkNfTUNGR19ERFJUWVBFX0VOQ09ERShTRFJDX01DRkdfRERSVFlQRV9NT0JJTEVfRERSKQkJCXwKKwkJIFNEUkNfTUNGR19SQU1UWVBFX0VOQ09ERShTRFJDX01DRkdfUkFNVFlQRV9ERFIpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTUNGR18wKTsKKworCS8qCisJICogU3RlcCA0OiBFc3RhYmxpc2ggdGhlIEFDIGZpbmUgdHVuaW5nIHRpbWluZyBjaGFyYWN0ZXJpc3RpY3MuCisJICovCisKKwlhY3RpbV9jdHJsYQorCQk9IChTRFJDX0FDVElNX0NUUkxBX1RSRkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSRkMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQykJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQVNfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0VOQ09ERShDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlJEKQl8CisJCSAgIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxBX1REQUxfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwpKTsKKworCWFjdGltX2N0cmxiCisJCT0gKFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9FTkNPREUoQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUikJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RDS0VfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UpCXwKKwkJICAgU0RSQ19BQ1RJTV9DVFJMQl9UWFBfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYUCkJfAorCQkgICBTRFJDX0FDVElNX0NUUkxCX1RYU1JfRU5DT0RFKENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IpKTsKKworCV9fcmF3X3dyaXRlbChhY3RpbV9jdHJsYSwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoYWN0aW1fY3RybGIsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKgorCSAqIFN0ZXAgNTogRXN0YWJsaXNoIHRoZSBtZW1vcnkgYXV0b3JlZnJlc2ggY29udHJvbAorCSAqLworCisJdmFsdWUgPQorCQkoU0RSQ19SRlJfQ1RSTF9BUkNWX0VOQ09ERSgxMjQ0KQkJCQkJCXwKKwkJIFNEUkNfUkZSX0NUUkxfQVJFX0VOQ09ERShTRFJDX1JGUl9DVFJMX0FSRV8xX0FSQ1YpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfUkZSX0NUUkxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX1BPV0VSX1JFR19XQUtFVVBfREVMQVlFRAkJCQkJCQkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfRU5DT0RFKDApCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRU5BQkxFCQkJCQkJCQkJfAorCQkgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0RJU0FCTEUJCQkJCQkJCXwKKwkJIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfRU5DT0RFKFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTk9ORSkJCQl8CisJCSBTRFJDX1BPV0VSX1JFR19QQUdFUE9MSUNZX0hQSEIpOworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgU0RSQ19QT1dFUl9SRUcpOworCisJLyoKKwkgKiBTdGVwIDY6IEVzdGFibGlzaCB0aGUgSkVERUMtZGVmaW5lZCBtb2RlIGFuZCBETEwgcGFyYW1ldGVycy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwlkZWxheSg1MDAwKTsJICAgICAgICAgICAgICAgICAKKworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX1BSRUNIQVJHRV9BTEwpLAorCQkJCSBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUoU0RSQ19NQU5VQUxfQ01EQ09ERV9BVVRPUkVGUkVTSCksCisJCQkJIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChTRFJDX01BTlVBTF9DTURDT0RFX0VOQ09ERShTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNIKSwKKwkJCQkgU0RSQ19NQU5VQUxfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX01SX1pFUk9fMQkJCQkJCQl8CisJCSBTRFJDX01SX1dCU1RfRU5BQkxFCQkJCQl8CisJCSBTRFJDX01SX1pFUk9fMAkJCQkJCQl8CisJCSBTRFJDX01SX0NBU0xfRU5DT0RFKFNEUkNfTVJfQ0FTTF8zKQl8CisJCSBTRFJDX01SX1NJTF9TRVJJQUwJCQkJCQl8CisJCSBTRFJDX01SX0JMX0VOQ09ERShTRFJDX01SX0JMXzQpKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIFNEUkNfTVJfMCk7CisKKwl2YWx1ZSA9CisJCShTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9FTkNPREUoMCkJCQkJCQkJCSB8CisJCSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9FTkNPREUoMCkJCQkJCQkJCQkgfAorCQkgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0VOQ09ERShTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfUFdEKSB8IAorCQkgU0RSQ19ETExBX0NUUkxfRExMX0VOQUJMRQkJCQkJCQkJCQkJIHwKKwkJIFNEUkNfRExMQV9DVFJMX0xPQ0tfVFJBQ0tJTkdERUxBWSk7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBTRFJDX0RMTEFfQ1RSTCk7CisKKwkvKgorCSAqIERlbGF5IGZvciBhICJyZWFzb25hYmx5IGxvbmciIHBlcmlvZCBvZiB0aW1lIHRvIGFsbG93IHRoZQorCSAqIHJlcXVlc3RlZCBjaGFuZ2VzIHRvIHRha2UgZWZmZWN0LgorCSAqLworCisgCWRlbGF5KDB4MjAwMDApOworfQorCisvKgorICogIHZvaWQgc19pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgdmVyeSBlYXJseSBzeXN0ZW0gaW5pdGlhbGl6YXRpb24gb2YgY2hpcAorICogICAgcGluIG11bHRpcGxleGluZyBhbmQgY2xvY2tzIGFuZCBpcyBjYWxsZWQgd2hlbiBPTkxZIGFuCisgKiAgICBTUkFNLWJhc2VkIHN0YWNrIGlzIGF2YWlsYWJsZSAoaS5lLiBubyBTRFJBTSkuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisKKwlkZWxheSgxMDApOworCisJcHJjbV9pbml0KCk7CisJcGVyX2Nsb2Nrc19lbmFibGUoKTsKKwljb25maWdfZGlhbW9uZF9zZHJhbSgpOworfQorCisvKgorICogIGludCBib2FyZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYW55IGVhcmx5LCBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbgorICogICAgZm9sbG93aW5nIGNvcmUgQ1BVIGluaXRpYWxpemF0aW9uIGJ1dCBwcmlvciB0byBzZXJpYWwgYW5kIE5BTkQKKyAqICAgIGluaXRpYWxpemF0aW9uLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorYm9hcmRfaW5pdCh2b2lkKQoreworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9kZXZpY2VfdHlwZSgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGRlY29kZWQgdmFsdWUgZnJvbSB0aGUgQ1BVJ3MKKyAqICAgIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIERFVklDRVRZUEUgZmllbGQsIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqICAgIGRldmljZSBpcyBvZiBUU1QsIEVNVSwgSFMgb3IgR1AgdHlwZS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgZGVjb2RlZCBDT05UUk9MX1NUQVRVUyByZWdpc3RlciBERVZJQ0VUWVBFIGZpZWxkLgorICoKKyAqLwordTMyCitnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKwljb25zdCBpbnQgdmFsdWUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUyk7CisKKwlyZXR1cm4gKENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfREVDT0RFKHZhbHVlKSk7Cit9CisKKy8qCisgKiAgdTMyIGdldF9zeXNib290X3ZhbHVlKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgZGVjb2RlZCB2YWx1ZSBmcm9tIHRoZSBDUFUncworICogICAgQ09OVFJPTF9TVEFUVVMgcmVnaXN0ZXIgU1lTQk9PVCBvcmRlciBzdWJmaWVsZCwgaW5kaWNhdGluZyB0aGUKKyAqICAgIG9yZGVyIG9mIG1lbW9yeSBpbnRlcmZhY2VzIGZyb20gd2hpY2ggdGhlIHByb2Nlc3NvciB3aWxsIGF0dGVtcHQKKyAqICAgIHRvIGJvb3QgaXRzZWxmLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBkZWNvZGVkIENPTlRST0xfU1RBVFVTIHJlZ2lzdGVyIFNZU0JPT1Qgb3JkZXIgc3ViZmllbGQuCisgKgorICovCit1MzIKK2dldF9zeXNib290X3ZhbHVlKHZvaWQpCit7CisjaWYgMAorCWNvbnN0IHUzMiB2YWx1ZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKTsKKwljb25zdCB1MzIgcGVyaXBoZXJhbF90eXBlID0gQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUw7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBhbmQgY2FsbGVycyBvZiBpdCBhcmUgaW1wbGljaXRseSBleHBlY3RpbmcgdGhlCisJICogTUVNT1JZIGludGVyZmFjZSAoU1lTQk9PVFs1XSA9PSAwKSBub3QgdGhlIFBFUkhJUEhFUkFMCisJICogaW50ZXJmYWNlIChTWVNCT09UWzVdID09IDEpIGJvb3Qgb3JkZXIsIHNvIGNoZWNrIHRoYXQgaXMKKwkgKiBhY3R1YWxseSB0aGUgY2FzZS4KKwkgKi8KKworCWlmIChDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHZhbHVlKSA9PSBwZXJpcGhlcmFsX3R5cGUpIHsKKwkJaGFuZygpOworCX0KKworCXJldHVybiAoQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9ERUNPREUodmFsdWUpKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAweDNmOworI2VuZGlmCit9CisKKy8qCisgKiAgaW50IGdldF9ib290X2RldmljZV9saXN0KGNvbnN0IHUzMioqIGRldmljZV9saXN0KQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSByZXR1cm5zIGEgY29uc3RhbnQgbGlzdCBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQKKyAqICAgIGRldmljZSBib290IGxpc3QuCisgKiAgICBJdCBnZXRzIGNhbGxlZCBmcm9tIHN0YXJ0X2FybWJvb3QgaW4gYm9hcmQuYworICoKKyAqICBJbnB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBPdXRwdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIFRoZSBwcmVmZXJyZWQgZmlyc3QgcHJvY2Vzc29yIG1lbW9yeSBib290IGludGVyZmFjZS4KKyAqCisgKi8KKworaW50CitnZXRfYm9vdF9kZXZpY2VzX2xpc3QoY29uc3QgdTMyKiogZGV2aWNlc19saXN0KQoreworCXN0YXRpYyB1MzIgbGlzdFtNQVhfSjQ5X0JPT1RfREVWSUNFU107CisJY29uc3QgdTMyIG1lbV9vcmRlciA9IGdldF9zeXNib290X3ZhbHVlKCk7CisKKwkvLyBzZXQgZGVmYXVsdHMKKwlpbnQgbnVtYmVyX29mX2RldmljZXMgPSAwOworCSpkZXZpY2VzX2xpc3QgPSAmbGlzdFswXTsKKworCXN3aXRjaCAobWVtX29yZGVyKSB7CisJY2FzZSAxNToKKwkJbGlzdFswXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsxXSA9IFVTQl9QRVJJUEhFUkFMOworCQlsaXN0WzJdID0gTU1DX05BTkQ7CisJCW51bWJlcl9vZl9kZXZpY2VzID0gTUFYX0o0OV9CT09UX0RFVklDRVM7CisJCWJyZWFrOworCWNhc2UgNDc6CisJCWxpc3RbMF0gPSBNTUNfTkFORDsKKwkJbGlzdFsxXSA9IEdQTUNfTkFORDsKKwkJbGlzdFsyXSA9IFVTQl9QRVJJUEhFUkFMOworCQludW1iZXJfb2ZfZGV2aWNlcyA9IE1BWF9KNDlfQk9PVF9ERVZJQ0VTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIG51bWJlcl9vZl9kZXZpY2VzOworfQorCisvKgorICogIGludCBtaXNjX2luaXRfcigpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIHBlcmZvcm1zIGFueSBtaXNjZWxsYW5lb3VzLCBib2FyZC1zcGVjaWZpYworICogICAgaW5pdGlhbGl6YXRpb24gZm9sbG93aW5nIENQVSwgZWFybHkgYm9hcmQsIHNlcmlhbCBhbmQgTkFORAorICogICAgaW5pdGlhbGl6YXRpb24gYnV0IHByaW9yIHRvIGxvYWRpbmcgdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlcgorICogICAgdG8gUkFNLgorICoKKyAqICAgIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgYm9hcmQtc3BlY2lmaWMgdG8gZG8uCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBPSzsgb3RoZXJ3aXNlLCBub24temVybyBvbiBlcnJvci4KKyAqCisgKi8KK2ludAorbWlzY19pbml0X3Iodm9pZCkKK3sKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisKKwlkbyB7CisJCXBlbmRpbmcgPSBfX3Jhd19yZWFkbCh3ZF9iYXNlICsgV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogIHZvaWQgZm9vYmFyKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUuLi4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3Blcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCitzdGF0aWMgaW50CitncG1jX2NvbmZpZ18wKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfR1BNQ19DT05GSUcxXzApCisJLyoKKwkgKiBGaXJzdCwgZGlzYWJsZSB0aGUgaW50ZXJmYWNlIGFuZCB3YWl0LgorCSAqLworCV9fcmF3X3dyaXRlbChHUE1DX0NPTkZJRzdfQ1NWQUxJRF9ESVNBQkxFRCwgR1BNQ19DT05GSUc3XzApOworCisJZGVsYXkoMTAwMCk7CisKKwkvKgorCSAqIE5leHQsIHByb2dyYW0gdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHMV8wLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzJfMCwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUczXzAsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoQ0ZHX0dQTUNfQ09ORklHNF8wLCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKENGR19HUE1DX0NPTkZJRzVfMCwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbChDRkdfR1BNQ19DT05GSUc2XzAsIEdQTUNfQ09ORklHNl8wKTsKKworCS8qCisJICogRmluYWxseSwgZW5hYmxlIHRoZSBHUE1DIG1hcHBpbmcgYW5kIHNwaW4gZm9yIHRoZSBwYXJhbWV0ZXJzIHRvCisJICogYmVjb21lIGFjdGl2ZS4KKwkgKi8KKwlfX3Jhd193cml0ZWwoKENGR19HUE1DX0NPTkZJRzdfMCB8IEdQTUNfQ09ORklHN19DU1ZBTElEX0VOQUJMRUQpLAorCQkJCSBHUE1DX0NPTkZJRzdfMCk7CisKKwlkZWxheSgyMDAwKTsKKworCWlmIChuYW5kX2NoaXAoKSl7CisJCXJldHVybiAoMSk7CisJfQorI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX0dQTUNfQ09ORklHMV8wKSAqLworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqICBpbnQgbmFuZF9pbml0KCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlcgorICogICAgKEdQTUMpIHN1Y2ggdGhhdCBvbi1ib2FyZCBOQU5EIGRldmljZXMgbWF5IGJlIGFjY2Vzc2VkIGZvcgorICogICAgc2Vjb25kLXN0YWdlIGJvb3QuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgMCBpZiBOQU5EIHdhcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQ7IG90aGVyd2lzZSwgMS4KKyAqCisgKi8KK2ludAorbmFuZF9pbml0KHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDE7CisKKwkvKgorCSAqIEVzdGFibGlzaCBHUE1DIGdsb2JhbCBzZXR0aW5ncy4KKwkgKi8KKworCV9fcmF3X3dyaXRlbChHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9TTUFSVCwgR1BNQ19TWVNDT05GSUcpOworCisJX19yYXdfd3JpdGVsKEdQTUNfSVJRRU5BQkxFX0FMTF9ESVNBQkxFLCBHUE1DX0lSUUVOQUJMRSk7CisKKwlfX3Jhd193cml0ZWwoR1BNQ19USU1FT1VURU5BQkxFX09GRiwgR1BNQ19USU1FT1VUX0NPTlRST0wpOworCisJaWYgKGdwbWNfY29uZmlnXzAoKSkgeworCQlwdXRzKCJVbnN1cHBvcnRlZCBOQU5EIGRldmljZSBAIEdQTUMwIVxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzdGF0dXMgPSAwOworCisgZG9uZToKKwkvKiBEdW1wIEdQTUMgYW5kIFNEUkMgcmVnaXN0ZXJzIGlmIHNvIGNvbmZpZ3VyZWQuICovCisKKwlvbWFwM19zZHJjX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19ncG1jX3JlZ2lzdGVyX2R1bXAoKTsKKwlvbWFwM19wcmNtX3JlZ2lzdGVyX2R1bXAoKTsKKworCXJldHVybiAoc3RhdHVzKTsKK30KKworLyoKKyAqICB2b2lkIGJvYXJkX2hhbmcoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBwZXJmb3JtcyBhbnkgYm9hcmQtc3BlY2lmaWMgYWN0aW9ucyB3aGVuIHRoZSBzeXN0ZW0KKyAqICAgIGhhbmdzIGJ5IGV4ZWN1dGluZyBoYW5nKCkuIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG87CisgKiAgICBob3dldmVyLCB3ZSBtaWdodCBsYXRlciBkcml2ZSB0aGUgcGllem8gb3IgYSBMRUQuCisgKgorICogIElucHV0KHMpOgorICogICAgTi9BCisgKgorICogIE91dHB1dChzKToKKyAqICAgIE4vQQorICoKKyAqICBSZXR1cm5zOgorICogICAgTi9BCisgKgorICovCit2b2lkCitib2FyZF9oYW5nICh2b2lkKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L211eC5jIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjN2RmMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L211eC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgSS9PIHBhZCBtdWx0aXBsZXhlciBjb25maWd1cmF0aW9uLgorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3N5c19wcm90by5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB2b2lkIHNldF9tdXhjb25mX3JlZ3MoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZXMgc2V0cyB0aGUgSS9PIHBhZCBtdWx0aXBsZXhlcnMgZm9yIFVBUlQsIEdQTUMsIFNEUkMsCisgKiAgICBHUElPLgorICoKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqLwordm9pZAorc2V0X211eGNvbmZfcmVncyh2b2lkKQoreworCS8qCisJICogVGhlIGJpdCBmaWVsZHMgZm9yIHRoZXNlIHNldHRpbmdzIGFyZSBhcyBmb2xsb3dzOgorCSAqCisJICogICBJe0VOLERJU30JIAktIElucHV0IEVuYWJsZS9EaXNhYmxlCisJICogICBQVFtEVV0JCSAJLSBQdWxsLWRvd24sIC11cAorCSAqICAgRElTLEVOCQkgIAktIFB1bGwtZG93biwgLXVwIGRpc2FibGVkL2VuYWJsZWQKKwkgKiAgIE1bMDEyMzQ1NjddCS0gQ29uZmlndXJhdGlvbiBtb2RlIDAtNworCSAqLworCisJLyoKKwkgKiBTRFJBTSBDb250cm9sbGVyIChTRFJDKQorCSAqCisJICogTW9zdCBvZiB0aGUgU0RSQyBzaWduYWxzIGFyZSB1c2VkIHRvIGRyaXZlIHRoZSBTYW1zdW5nCisJICogSzRYNTExNjNQSS1GQ0c2IDUxMiBNYiB4IDE2LWJpdCAoNjQgTWlCKSBERFIgU0RSQU0uIEJlY2F1c2Ugd2UKKwkgKiBpbnRlcmZhY2UgaW4gMTYtYml0IHJhdGhlciB0aGFuIDMyLWJpdCBtb2RlLCB3ZSBwbGFjZSB0aGUKKwkgKiB1bnVzZWQgcGlucyBpbiBzYWZlIG1vZGUgKE1vZGUgNykuCisJICovCisKKwlNVVhfVkFMKENQKFNEUkNfRDApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QwCisJTVVYX1ZBTChDUChTRFJDX0QxKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EMQorCU1VWF9WQUwoQ1AoU0RSQ19EMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDIKKwlNVVhfVkFMKENQKFNEUkNfRDMpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0QzCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENAorCU1VWF9WQUwoQ1AoU0RSQ19ENSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDUKKwlNVVhfVkFMKENQKFNEUkNfRDYpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q2CisJTVVYX1ZBTChDUChTRFJDX0Q3KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19ENworCU1VWF9WQUwoQ1AoU0RSQ19EOCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDgKKwlNVVhfVkFMKENQKFNEUkNfRDkpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0Q5CisJTVVYX1ZBTChDUChTRFJDX0QxMCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEwCisJTVVYX1ZBTChDUChTRFJDX0QxMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDExCisJTVVYX1ZBTChDUChTRFJDX0QxMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEyCisJTVVYX1ZBTChDUChTRFJDX0QxMyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDEzCisJTVVYX1ZBTChDUChTRFJDX0QxNCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE0CisJTVVYX1ZBTChDUChTRFJDX0QxNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNEUkNfRDE1CisKKwkvLyBCZWNhdXNlIHdlIGludGVyZmFjZSBTRFJBTSBpbiAxNi1iaXQgbW9kZSwgcGxhY2UKKwkvLyBTRFJDX0RBVEFbMzE6MTZdIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QxOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI2KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QyNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKFNEUkNfRDI5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0QzMCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoU0RSQ19DTEspLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0NMSworCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU0RSQ19EUVMwCisJTVVYX1ZBTChDUChTRFJDX0RRUzEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTRFJDX0RRUzEKKworCS8vIFBsYWNlIHVudXNlZCBEUSBwaW5zIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoU0RSQ19EUVMyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8qCisJICogR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKQorCSAqCisJICovCisKKwlNVVhfVkFMKENQKEdQTUNfQTEpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0ExCisJTVVYX1ZBTChDUChHUE1DX0EyKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BMgorCU1VWF9WQUwoQ1AoR1BNQ19BMyksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTMKKwlNVVhfVkFMKENQKEdQTUNfQTQpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E0CisJTVVYX1ZBTChDUChHUE1DX0E1KSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19BNQorCU1VWF9WQUwoQ1AoR1BNQ19BNiksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfQTYKKwlNVVhfVkFMKENQKEdQTUNfQTcpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0E3CisKKwkvLyBQbGFjZSB0aGUgdW51c2VkIEdQTUNfQTggcGluIGluIHNhZmUgbW9kZSAoTW9kZSA3KS4KKworCU1VWF9WQUwoQ1AoR1BNQ19BOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEdQTUNfQTkgdG8gR1BJT180MiB1c2VkIGFzIGEgcHVzaC1wdWxsLCBhY3RpdmUgbG93IGlucHV0CisJLy8gZnJvbSB0aGUgVVNCIFBIWSBmb3IgVVNCIHN1c3BlbmQgbm90aWZpY2F0aW9uLgorCisJTVVYX1ZBTChDUChHUE1DX0E5KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gR1BJT180MgorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCU1VWF9WQUwoQ1AoR1BNQ19EMCksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDAKKwlNVVhfVkFMKENQKEdQTUNfRDEpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0QxCisJTVVYX1ZBTChDUChHUE1DX0QyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMgorCU1VWF9WQUwoQ1AoR1BNQ19EMyksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDMKKwlNVVhfVkFMKENQKEdQTUNfRDQpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q0CisJTVVYX1ZBTChDUChHUE1DX0Q1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19ENQorCU1VWF9WQUwoQ1AoR1BNQ19ENiksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDYKKwlNVVhfVkFMKENQKEdQTUNfRDcpLAkJKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX0Q3CisJTVVYX1ZBTChDUChHUE1DX0Q4KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EOAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfRDkKKwlNVVhfVkFMKENQKEdQTUNfRDEwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTAKKwlNVVhfVkFMKENQKEdQTUNfRDExKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTEKKwlNVVhfVkFMKENQKEdQTUNfRDEyKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTIKKwlNVVhfVkFMKENQKEdQTUNfRDEzKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTMKKwlNVVhfVkFMKENQKEdQTUNfRDE0KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTQKKwlNVVhfVkFMKENQKEdQTUNfRDE1KSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19EMTUKKwlNVVhfVkFMKENQKEdQTUNfTkNTMCksCQkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkNTMAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19uQ1MxCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLAkJKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpOwkvLyBHUE1DX25DUzIKKwlNVVhfVkFMKENQKEdQTUNfTkNTMyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKworCS8vIEFzc2lnbiBHUE1DX05DUzYgdG8gR1BUMTFfUFdNX0VWVCB1c2VkIGFzIGEgcHVzaC1wdWxsIHB1bHNlIHdpZHRoCisJLy8gbW9kdWxhdGVkIChQV00pIHNpZ25hbCBmb3IgdGhlIHBpZXpvLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMykpOwkvLyBHUFQxMV9QV01fRVZUCisKKwkvLyBBc3NpZ24gR1BNQ19OQ1M3IHRvIEdQSU9fNTggdXNlZCBhcyBhIHB1c2gtcHVsbCBvdXRwdXQKKwkvLyBQSUVaT19ORU5BQkxFIHRvIHRoZSBUSSBTTjc0TFZDMkcyNDAgRHVhbCBCdWZmZXIvRHJpdmVyIFdpdGgKKwkvLyAzLVN0YXRlIE91dHB1dHMgaW5wdXRzLgorCisJTVVYX1ZBTChDUChHUE1DX05DUzcpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNCkpOwkvLyBHUElPXzU4CisKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwJCShJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19DTEsKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLAkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbkFEVl9BTEUKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uT0UKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gR1BNQ19uV0UKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLAkoSURJUyB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfbkJFMF9DTEUKKworCS8vIEFzc2lnbiBHUE1DX05CRTEgdG8gR1BJT182MSB1c2VkIGFzIGEgcHVzaC1wdWxsIG91dHB1dCB0byB0aGUKKwkvLyBaaWdCZWUgYWN0aXZlLWxvdyByZXNldC4KKworCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182MQorCisJTVVYX1ZBTChDUChHUE1DX05XUCksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEdQTUNfbldQCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwJCShJRU4gIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gR1BNQ19XQUlUMAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksCQkoSUVOICB8IFBUVSB8IEVOICB8IE0wKSk7CS8vIEdQTUNfV0FJVDEKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbmF2YWlsYWJsZQorCisJLy8gQXNzaWduIEdQTUNfV0FJVDMgdG8gR1BJT182NSB1c2VkIGFzIGFuIGFjdGl2ZS1oaWdoLCBwdXNoLXB1bGwKKwkvLyBiYWNrcGxhdGUgZGV0ZWN0IGlucHV0LgorCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTQpKTsJLy8gR1BJT182NQorCisJLyoKKwkgKiBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKQorCSAqCisJICogQWxsIERTUyBzaWduYWxzIGFyZSB1c2VkIGluIHRoZWlyIG5vcm1hbCwgZGVmYXVsdCBtb2RlIChNb2RlIDApCisJICogdG8gZHJpdmUgdGhlIFNhbXN1bmcgTE1TMzUwREYwWzEzXSBMQ0QgZGlzcGxheSBwYW5lbC4KKwkgKi8KKworCU1VWF9WQUwoQ1AoRFNTX1BDTEspLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfUENMSworCU1VWF9WQUwoQ1AoRFNTX0hTWU5DKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0hTWU5DCisJTVVYX1ZBTChDUChEU1NfVlNZTkMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfVlNZTkMKKwlNVVhfVkFMKENQKERTU19BQ0JJQVMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfQUNCSUFTCisJTVVYX1ZBTChDUChEU1NfREFUQTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTAKKwlNVVhfVkFMKENQKERTU19EQVRBMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyCisJTVVYX1ZBTChDUChEU1NfREFUQTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTMKKwlNVVhfVkFMKENQKERTU19EQVRBNCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEE1KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE1CisJTVVYX1ZBTChDUChEU1NfREFUQTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTYKKwlNVVhfVkFMKENQKERTU19EQVRBNyksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBNworCU1VWF9WQUwoQ1AoRFNTX0RBVEE4KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEE4CisJTVVYX1ZBTChDUChEU1NfREFUQTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTkKKwlNVVhfVkFMKENQKERTU19EQVRBMTApLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEwCisJTVVYX1ZBTChDUChEU1NfREFUQTExKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExMQorCU1VWF9WQUwoQ1AoRFNTX0RBVEExMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTIKKwlNVVhfVkFMKENQKERTU19EQVRBMTMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTEzCisJTVVYX1ZBTChDUChEU1NfREFUQTE0KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExNSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTUKKwlNVVhfVkFMKENQKERTU19EQVRBMTYpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE2CisJTVVYX1ZBTChDUChEU1NfREFUQTE3KSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEExNworCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMTgKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTE5CisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIERTU19EQVRBMjEKKwlNVVhfVkFMKENQKERTU19EQVRBMjIpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBEU1NfREFUQTIyCisJTVVYX1ZBTChDUChEU1NfREFUQTIzKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTApKTsJLy8gRFNTX0RBVEEyMworCisJTVVYX1ZBTChDUChDQU1fV0VOKSwJCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gVW51c2VkCisKKwkvKgorCSAqIFVuaXZlcnNhbCBBc3luY2hyb25vdXMgUmVjZWl2ZXIgLyBUcmFuc21pdHRlciAoVUFSVCkKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChVQVJUMV9UWCksCQkoSURJUyB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFVBUlQxX1RYCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLAkJKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVQVJUMV9SVFMKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVBUlQxX0NUUworCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBVQVJUMV9SWAorCS8qCisJICogQ29udHJvbCBhbmQgRGVidWcKKwkgKgorCSAqLworCisJTVVYX1ZBTChDUChTWVNfMzJLKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTXzMySworCU1VWF9WQUwoQ1AoU1lTX0JPT1QwKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QwCisJTVVYX1ZBTChDUChTWVNfQk9PVDEpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDEKKwlNVVhfVkFMKENQKFNZU19CT09UMiksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UMgorCU1VWF9WQUwoQ1AoU1lTX0JPT1QzKSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1QzCisJTVVYX1ZBTChDUChTWVNfQk9PVDQpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBTWVNfQk9PVDQKKwlNVVhfVkFMKENQKFNZU19CT09UNSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIFNZU19CT09UNQorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q2KSwJCShJRU4gIHwgUFREIHwgRElTIHwgTTApKTsJLy8gU1lTX0JPT1Q2CisJTVVYX1ZBTChDUChTWVNfQ0xLT1VUMSksICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKTsJLy8gU1lTX0NMS09VVDEKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpOwkvLyBVbnVzZWQKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX25UUlNUCisJTVVYX1ZBTChDUChKVEFHX1RDSyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVENLCisJTVVYX1ZBTChDUChKVEFHX1RNUyksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVE1TCisJTVVYX1ZBTChDUChKVEFHX1RESSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfVERJCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLAkJKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpOwkvLyBKVEFHX0VNVTAKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksCQkoSUVOICB8IFBURCB8IERJUyB8IE0wKSk7CS8vIEpUQUdfRU1VMQorCU1VWF9WQUwoQ1AoRVRLX0NMS19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0NUTF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QwX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QyX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QzX0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q0X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q1X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q2X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q3X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q4X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0Q5X0VTMiksCQkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMF9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMV9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxMl9FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCU1VWF9WQUwoQ1AoRVRLX0QxM19FUzIpLAkoSURJUyB8IFBURCB8IERJUyB8IE03KSk7CS8vIFVudXNlZAorCisJLy8gQXNzaWduIEVUS19EMVs0NV0gYXMgTU0yX1JYUkNWIGFuZCBNTTJfVFhTRTAgVVNCIEZTL0xTIEhvc3QKKwkvLyAoTW9kZSA1KQorCisJTVVYX1ZBTChDUChFVEtfRDE0X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1JYUkNWCisJTVVYX1ZBTChDUChFVEtfRDE1X0VTMiksCShJRElTIHwgUFREIHwgRElTIHwgTTcpKTsJLy8gTU0yX1RYU0UwCit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ5ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiAgICBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiAgICBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0dXAgZm9yIHRoZSBOZXN0IExlYXJuaW5nCisgKiAgICAgIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBJdCBpbmhlcml0cyBlbnRpcmVseSBmcm9tIHRoZSBlcXVpdmFsZW50IFRJIE9NQVAzIEVWTQorICoJZmlsZS4KKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiAzNDMwIFgtbG9hZGVyIGN1cnJlbnRseSBkb2VzIG5vdCB1c2UgdGhpcyBjb2RlLgorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdG1mZCBzcCEsIHtyNC1yNn0KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjQsIHBsbF9jdGxfYWRkCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0KK3dhaXQxOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBiZXEgICAgIHdhaXQxICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKworCS8qIHNldCBuZXcgZHBsbCBkaXZpZGVycyBfYWZ0ZXJfIGluIGJ5cGFzcyAqLworCWxkciAgICAgcjUsIHBsbF9kaXZfYWRkMQorICAgICAgICBzdHIgICAgIHIxLCBbcjVdICAgICAgICAgIC8qIHNldCBtLCBuLCBtMiAqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDIKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAvKiBzZXQgbDMvbDQvLi4gZGl2aWRlcnMqLworICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDMgIC8qIHdrdXAgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWwzICAvKiByc20gdmFsICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1CisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLworICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisvKiBUaGUgTm9yIGhhcyB0byBiZSBpbiB0aGUgRmxhc2ggQmFzZSBDUzAgZm9yIHRoaXMgY29uZGl0aW9uIHRvIGhhcHBlbiAqLworZmxhc2hfY2ZnMV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzFfMCkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHM18wKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJRzRfMCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUc1XzApCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTAorcGxsX2Rpdl9hZGQyOgorICAgIC53b3JkIENNX0NMS1NFTF9DT1JFCitwbGxfZGl2X2FkZDM6CisgICAgLndvcmQgQ01fQ0xLU0VMX1dLVVAKK3BsbF9kaXZfdmFsMzoKKyAgICAud29yZCAoV0tVUF9SU00gPDwgMSkKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisjZW5kaWYgLyogIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgKi8KKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKyAgICAgICAgYmwgICAgICBzX2luaXQgICAgICAgICAgLyogZ28gc2V0dXAgcGxsLG11eCxtZW1vcnkgKi8KKyAgICAgICAgbGRyICAgICBpcCwJW3NwXSAgICAvKiByZXN0b3JlIHNhdmUgaXAgKi8KKwltb3YJbHIsCWlwCS8qIHJlc3RvcmUgbGluayByZWcgKi8KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRQorLndvcmQgMHgwNworLndvcmQgMHgwNQorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDFGNAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5Cisud29yZCAweDEyCisud29yZCAweDA0Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDE3Cisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdECisud29yZCAweDE5Cisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEZBCisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEKKy53b3JkIDB4MzIKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEKKy53b3JkIDB4MkYKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwNQorLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE2OAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDBCCisud29yZCAweDA2Cisud29yZCAweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdECisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxM0YKKy53b3JkIDB4MzAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEKKy53b3JkIDB4MTcKKy53b3JkIDB4MDYKKy53b3JkIDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MEUKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MTAKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNEMKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDFCMgorLndvcmQgMHgyMQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBBNgorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MDkKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMQorLndvcmQgMHgxMworLndvcmQgMHgwNworLndvcmQgMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyoKKyAqIFRhYmxlcyBmb3IgMzZ4LzM3eCBkZXZpY2VzCisgKgorICogKFBvcHVsYXRlZCBmb3IgMTNNSHogb25seSkKKyAqLworbXB1XzM2eF9kcGxsX3BhcmFtOgorLy8gICAgTSAgICBOICAgRlMgTTIKKyNpZiBkZWZpbmVkKENPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaKQorLndvcmQgMTUwLCAgNSwgMCwgMSAJLy8gMTIgICBNSHoKKy53b3JkIDMwMCwgMTIsIDAsIDEgCS8vIDEzICAgTUh6Cisud29yZCAxMjUsICA3LCAwLCAxIAkvLyAxOS4yIE1IegorLndvcmQgMTUwLCAxMiwgMCwgMSAJLy8gMjYgICBNSHoKKy53b3JkIDEyNSwgMTUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopCisud29yZCAzMDAsICA1LCAwLCAxIAkvLyAxMiAgIE1IegorLndvcmQgNjAwLCAxMiwgMCwgMSAJLy8gMTMgICBNSHoKKy53b3JkIDEyNSwgIDMsIDAsIDEgCS8vIDE5LjIgTUh6Cisud29yZCAzMDAsIDEyLCAwLCAxIAkvLyAyNiAgIE1IegorLndvcmQgMTI1LCAgNywgMCwgMSAJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJNUFUgRFBMTCBzZXR0aW5ncyBhcmUgbm90IGRlZmluZWQhIgorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFopICovCisKK2l2YV8zNnhfZHBsbF9wYXJhbToKKy8vICAgICBNICAgTiAgIEZTIE0yCisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgMTAsICAwLCAwLCAxCS8vIDE2LjggTUh6CisKK2NvcmVfMzZ4X2RwbGxfcGFyYW06CisvLyAgICBNICAgIE4gICBGUyBNMgorI2lmIGRlZmluZWQoQ09ORklHX1NZU19DT1JFX0RQTExfMjAwTUhaKQorLndvcmQgMTAwLCAgNSwgMCwgMQkvLyAxMiAgIE1IegorLndvcmQgMjAwLCAxMiwgMCwgMQkvLyAxMyAgIE1IegorLndvcmQgMzc1LCAzNSwgMCwgMQkvLyAxOS4yIE1IegorLndvcmQgMTAwLCAxMiwgMCwgMQkvLyAyNiAgIE1IegorLndvcmQgMzc1LCA3MSwgMCwgMQkvLyAzOC40IE1IegorLndvcmQgICAwLCAgMCwgMCwgMQkvLyAxNi44IE1IeiAtIFRCRAorI2VsaWYgZGVmaW5lZChDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFopCisud29yZCAxNjYsICA1LCAwLCAxCS8vIDEyICAgTUh6Cisud29yZCAzMzIsIDEyLCAwLCAxCS8vIDEzICAgTUh6Cisud29yZCA0MTUsIDIzLCAwLCAxCS8vIDE5LjIgTUh6Cisud29yZCAxNjYsIDEyLCAwLCAxCS8vIDI2ICAgTUh6Cisud29yZCA0MTUsIDQ3LCAwLCAxCS8vIDM4LjQgTUh6Cisud29yZCAgIDAsICAwLCAwLCAxCS8vIDE2LjggTUh6IC0gVEJECisjZWxpZiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikKKy53b3JkIDIwMCwgIDUsIDAsIDEJLy8gMTIgICBNSHoKKy53b3JkIDQwMCwgMTIsIDAsIDEJLy8gMTMgICBNSHoKKy53b3JkIDM3NSwgMTcsIDAsIDEJLy8gMTkuMiBNSHoKKy53b3JkIDIwMCwgMTIsIDAsIDEJLy8gMjYgICBNSHoKKy53b3JkIDM3NSwgMzUsIDAsIDEJLy8gMzguNCBNSHoKKy53b3JkICAgMCwgIDAsIDAsIDEJLy8gMTYuOCBNSHogLSBUQkQKKyNlbHNlCisjIGVycm9yICJDb3JlIERQTEwgc2V0dGluZ3MgYXJlIG5vdCBkZWZpbmVkISIKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19TWVNfQ09SRV9EUExMXzQwME1IWikgKi8KKworLyoKKyAqIEZvciB0aGUgcGVyaXBoZXJhbCAoUEVSKSAoYWthIERQTEw0KSBjbG9jayBzZXR0aW5ncywgdGhlcmUgYXJlIG9ubHkKKyAqIGVmZmVjdGl2ZWx5IHR3byBjbG9jayBjaG9pY2VzLCA5NiBNSHogb3IgMTkyIE1Iei4gSG93ZXZlciwgdGhlIG9ubHkKKyAqIHRpbWUgMTkyIE1IeiBpcyBhcHQgdG8gYmUgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbiBpcyBpZiBib3RoIFNHWCBhbmQKKyAqIFRWIG91dHB1dCBhcmUgdXNlZC4KKyAqCisgKiAgIEZvciBhbnkgZ2l2ZW4gc3lzdGVtIGNsb2NrLCB0aGUgZGl2aWRlcnMgYXJlIGNvbmZpZ3VyZWQgdGh1cyAocGVyCisgKiAgIFNlY3Rpb24gMy41LjMuMy4zLjIgIlR5cGUgQiBEUExMIChMb3ctSml0dGVyKSIgb2YgdGhlIE9NQVAzIFRSTSk6CisgKgorICogICAgIFBFUltjbGtvdXRdID0gKFNZU1tjbGtvdXRdICogTSkgLyAoTiArIDEpCisgKgorICogICAgICAgTTJbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMiAgICAgICAgICAgdXNlZCBieSBVQVJULCBNTUMsIEkyQywgZXRjLgorICogICAgICAgTTNbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNMyAgICAgICAgICAgdXNlZCBieSBUViBvdXQuCisgKiAgICAgICBNNFtjbGtvdXRdOiBQRVJbY2xrb3V0XSAvIE00ICAgICAgICAgICB1c2VkIGJ5IERTUy4KKyAqICAgICAgIE01W2Nsa291dF06IFBFUltjbGtvdXRdIC8gTTUgICAgICAgICAgIHVzZWQgYnkgY2FtZXJhLgorICogICAgICAgTTZbY2xrb3V0XTogUEVSW2Nsa291dF0gLyBNNiAgICAgICAgICAgdXNlZCBieSBlbXVsYXRpb24uCisgKgorICogIFNvLCBmb3IgYSAxOS4yIE1IeiBzeXN0ZW0gY2xvY2sgYW5kIHRoZSBzY2FsYXIgZW50cmllcyBiZWxvdzoKKyAqCisgKiAgICAgICBQRVJbY2xrb3V0XSA9ICgxOS4yICogNTQwKSAvICgxMSArIDEpID0gODY0CisgKgorICogICAgICAgTTJbY2xrb3V0XTogODY0IC8gIDkgPSAgOTYgICBNSHoKKyAqICAgICAgIE0zW2Nsa291dF06IDg2NCAvIDE2ID0gIDU0ICAgTUh6CisgKiAgICAgICBNNFtjbGtvdXRdOiA4NjQgLyAgNSA9IDE3Mi44IE1IegorICogICAgICAgTTVbY2xrb3V0XTogODY0IC8gIDQgPSAyMTYgICBNSHoKKyAqICAgICAgIE02W2Nsa291dF06IDg2NCAvICAzID0gMjg4ICAgTUh6CisgKi8KK3Blcl8zNnhfZHBsbF9wYXJhbToKKy8vICAgIFNZU19DTEsgICAgTSAgICAgIE4gICAgICBNMiAgICAgIE0zICAgICAgTTQgICAgIE01ICAgICAgTTYgICAgICBtMkRJVgorLndvcmQgMTIwMDAsICAgIDQzMiwgICAgNSwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDEyICAgTUh6Cisud29yZCAxMzAwMCwgICAgODY0LCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMTMgICBNSHoKKy53b3JkIDE5MjAwLCAgICA1NDAsICAgMTEsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxOS4yIE1IegorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEJCS8vIDI2ICAgTUh6Cisud29yZCAzODQwMCwgICAgMjcwLCAgIDExLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQkJLy8gMzguNCBNSHoKKy53b3JkIDE2ODAwLCAgICAzNjAsICAgIDYsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCQkvLyAxNi44IE1IegorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3BsYXRmb3JtLmggYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOGMxMmQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9uZXN0L2o0OS9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbiBwcm90b3R5cGVzIGZvcgorICogICAgICBhY2Nlc3NpbmcgRGlnaXRhbCBQaGFzZWQgTG9jayBMb29wIChEUExMKSBwYXJhbWV0ZXJzIGFuZAorICogICAgICBzZXR0aW5ncy4KKyAqCisgKi8KKworI2lmbmRlZiBfTkVTVF9KNDlfUExBVEZPUk1fSF8KKyNkZWZpbmUgX05FU1RfSjQ5X1BMQVRGT1JNX0hfCisKKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisvKgorICogVHlwZSBEZWZpbml0aW9ucworICovCisKKy8qIFVzZWQgdG8gaW5kZXggaW50byBEUExMIHBhcmFtZXRlciB0YWJsZXMgKi8KKworc3RydWN0IGRwbGxfcGFyYW0geworCXUzMiBtOworCXUzMiBuOworCXUzMiBmc2VsOworCXUzMiBtMjsKK307CisKK3N0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0geworCXUzMiBzeXNfY2xrOworCXUzMiBtOworCXUzMiBuOworCXUzMiBtMjsKKwl1MzIgbTM7CisJdTMyIG00OworCXUzMiBtNTsKKwl1MzIgbTY7CisJdTMyIG0yZGl2OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgZHBsbF9wYXJhbSBkcGxsX3BhcmFtOworCisvKgorICogSW5saW5lIEZ1bmN0aW9ucworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gcGxhdGZvcm0uUy4KKyAqLworCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9pdmFfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTkVTVF9KNDlfUExBVEZPUk1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3ByY20uYyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3ByY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkvcHJjbS5jCkBAIC0wLDAgKzEsNTY1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgYm9hcmQtc3BlY2lmaWMgc2V0LXVwIGZvciB0aGUgTmVzdCBMZWFybmluZworICogICAgICBUaGVybW9zdGF0IGJvYXJkLCBiYXNlZCBvbiB0aGUgVEkgT01BUDMgQU0zNzAzQ1VTLCBmb2N1c2luZworICogICAgICBwcmltYXJpbHkgY2xvY2sgc2V0LXVwIGZvciB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZAorICogICAgICBDbG9jayBNYW5hZ2VyIChQUkNNKQorICoKKyAqICAgICAgVGhpcyBpcyBvcmlnaW5hbGx5IGluaGVyaXRlZCBhbmQgc3BsaXQgZnJvbSB0aGUgT01BUDMgRVZNCisgKiAgICAgIGJvYXJkIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCisjaW5jbHVkZSAicGxhdGZvcm0uaCIKKworLyoKKyAqICB1MzIgZ2V0X29zY19jbGtfc3BlZWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBkZXRlcm1pbmVzIHRoZSByZWZlcmVuY2Ugb3NjaWxsYXRvciBzcGVlZCBiYXNlZCBvbgorICogICAgYSBrbm93biAzMiBrSHogY2xvY2sgYW5kIGdlbmVyYWwgcHVycG9zZSB0aW1lci4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBUaGUgcmVmZXJlbmNlIG9zY2lsbGF0b3IgY2xvY2sgc3BlZWQuCisgKgorICovCitzdGF0aWMgdTMyCitnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoKKyAqICB2b2lkIGdldF9zeXNfY2xraW5fc2VsKCkKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBQUkNNIFBSTSBzeXN0ZW0gY2xvY2sKKyAqICAgIGZyZXF1ZW5jeSBzZWxlY3Rvciwgd2hpY2ggc2hvdWxkIGJlIHdyaXR0ZW4gdG8gUFJNX0NMS1NFTC4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBoZXJ0eiAgLSBUaGUgc3BlZWQsIGluIE1IeiwgdGhhdCB0aGUgc3lzdGVtIGNsb2NrIGlzIGJlbGlldmVkCisgKiAgICAgICAgICAgICAgIHRvIGJlIHJ1bm5pbmcgYXQuCisgKiAgICBzeXNfY2xraW5fc2VsIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBpbmRleCB1c2VkIHRvIGFjY2VzcyB0aGUKKyAqICAgICAgICAgICAgICAgZGlnaXRhbCBQTEwgc2V0dGluZ3MuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIHN5c19jbGtpbl9zZWwgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IGZvciB0aGUgZGlnaXRhbCBQTEwgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzcGVjaWZpZWQgc3lzdGVtIGNsb2NrIHJhdGUuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkCitnZXRfc3lzX2Nsa2luX3NlbCh1MzIgaGVydHosIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlzd2l0Y2ggKGhlcnR6KSB7CisKKwljYXNlIFMzOF80TToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMzhfNF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMjZNOgorCQkqc3lzX2Nsa2luX3NlbCA9IFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWjsKKwkJYnJlYWs7CisKKwljYXNlIFMxOV8yTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTlfMl9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTZfOE06CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE2XzhfTUhaOworCQlicmVhazsKKworCWNhc2UgUzEzTToKKwkJKnN5c19jbGtpbl9zZWwgPSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfMTNfMF9NSFo7CisJCWJyZWFrOworCisJY2FzZSBTMTJNOgorCWRlZmF1bHQ6CisJCSpzeXNfY2xraW5fc2VsID0gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzEyXzBfTUhaOworCQlicmVhazsKKworCX0KK30KKworLyoKKyAqIE9NQVAzNHgvMzV4IHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfY29yZV9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlwdHIgPSBwdHIgKyAyKmNsa19pbmRleCArIHNpbF9pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNFgpOwkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKworCS8qIEZSRVFTRUwgKENPUkVfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgICA0LCA0LCBwdHItPmZzZWwpOworCXNyMzIoQ01fQ0xLRU5fUExMLCAgIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorbXB1X2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBNUFUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJLyogTTIgKE1QVV9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMX01QVSwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChNUFVfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDJfUExMX01QVVs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKE1QVV9EUExMX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoTVBVX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfTVBVWzQ6N10gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDQsIDQsIHB0ci0+ZnNlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChJVkEyX0RQTExfRlJFUVNFTCkgOiBDTV9DTEtFTl9QTExfSVZBMls0OjddICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fSVZBMl9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CisKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKK30KKworLyoKKyAqIE9NQVAzNjMwIHNwZWNpZmljIGZ1bmN0aW9ucworICovCitzdGF0aWMgdm9pZAorZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZAorZHBsbDRfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqcHRyOworCisJcHRyID0gKHN0cnVjdCBkcGxsX3Blcl8zNnhfcGFyYW0gKilnZXRfMzZ4X3Blcl9kcGxsX3BhcmFtKCk7CisKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBNNiAoRElWX0RQTEw0KTogQ01fQ0xLU0VMMV9FTVVbMjQ6MjldICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDYsIHB0ci0+bTYpOworCisJLyogTTUgKENMS1NFTF9DQU0pOiBDTV9DTEtTRUwxX0VNVVswOjVdICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA2LCBwdHItPm01KTsKKworCS8qIE00IChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbMDo1XSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNiwgcHRyLT5tNCk7CisKKwkvKiBNMyAoQ0xLU0VMX0RTUzEpOiBDTV9DTEtTRUxfRFNTWzg6MTNdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA2LCBwdHItPm0zKTsKKworCS8qIE0yIChESVZfOTZNKTogQ01fQ0xLU0VMM19QTExbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoUEVSSVBIX0RQTExfTVVMVCk6IENNX0NMS1NFTDJfUExMWzg6MTldICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgOCwgMTIsIHB0ci0+bSk7CisKKwkvKiBOIChQRVJJUEhfRFBMTF9ESVYpOiBDTV9DTEtTRUwyX1BMTFswOjZdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTCwgMCwgNywgcHRyLT5uKTsKKworCS8qIE0yRElWIChDTEtTRUxfOTZNKTogQ01fQ0xLU0VMX0NPUkVbMTI6MTNdICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMTIsIDIsIHB0ci0+bTJkaXYpOworCisJLyogTE9DSyBNT0RFIChFTl9QRVJJUEhfRFBMTCk6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDIsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKK30KKworc3RhdGljIHZvaWQKK21wdV9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgKDIqY2xrX2luZGV4KSArIHNpbF9pbmRleDsKKworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCS8qIE0yIChNUFVfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIHB0ci0+bTIpOworCisJLyogTSAoTVBVX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwyX1BMTF9NUFVbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIHB0ci0+bSk7CisKKwkvKiBOIChNUFVfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgMCwgNywgcHRyLT5uKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fTVBVX0RQTEwpIDogQ01fQ0xLRU5fUExMX0lWQTJbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7Cit9CisKK3N0YXRpYyB2b2lkCitpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiAgdm9pZCBwcmNtX2luaXQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBpbml0aWFsaXplcyBjbG9ja3MgaW4gYSBib2FyZC1zcGVjaWZpYyBtYW5uZXIgZm9yCisgKiAgICB0aGUgcHJvY2Vzc29yJ3MgUG93ZXIsIFJlc2V0IGFuZCBDbG9jayBNYW5hZ2VyIChQUkNNKSBhbmQgaXMKKyAqICAgIGNhbGxlZCBvbmx5IHdoZW4gYW4gU1JBTS1iYXNlZCBzdGFjayBpcyBhdmFpbGFibGUgKGkuZS4gbm8KKyAqICAgIFNEUkFNKS4KKyAqCisgKiAgSW5wdXQocyk6CisgKiAgICBOL0EKKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgTi9BCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3ZvaWQKK3ByY21faW5pdCh2b2lkKQoreworCXUzMiBzeXNfY2xrX3JhdGUgPSAwLCBzeXNfY2xraW5fc2VsLCBzeXNfY2xrX2RpdjsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJc3lzX2Nsa19yYXRlID0gZ2V0X29zY19jbGtfc3BlZWQoKTsKKwlnZXRfc3lzX2Nsa2luX3NlbChzeXNfY2xrX3JhdGUsICZzeXNfY2xraW5fc2VsKTsKKworCS8qIFNldCB0aGUgUFJNX0NMS1NFTF9TWVNfQ0xLSU5fU0VMIHZhbHVlIGluIHRoZSBwcm9jZXNzb3IuICovCisKKwlzcjMyKFBSQ01fUFJNX0NDUl9DTEtTRUwsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfU1RBUlQsCisJCSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfQklUUywKKwkJIHN5c19jbGtpbl9zZWwpOworCisJLyogSWYgdGhlIGlucHV0IGNsb2NrIGlzIGdyZWF0ZXIgdGhhbiAxOS4yTSBhbHdheXMgZGl2aWRlIGJ5IHR3by4KKwkgKgorCSAqIE9uIE9NQVAzNjMwLCBERFIgZGF0YSBjb3JydXB0aW9uIGhhcyBiZWVuIG9ic2VydmVkIG9uIE9GRiBtb2RlCisJICogZXhpdCBpZiB0aGUgc3lzIGNsb2NrIHdhcyBsb3dlciB0aGFuIDI2TS4gQXMgYSB3b3JrIGFyb3VuZCwKKwkgKiBPTUFQMzYzMCBpcyBvcGVyYXRlZCBhdCAyNk0gc3lzIGNsb2NrIGFuZCB0aGlzIGludGVybmFsIGRpdmlzaW9uCisJICogaXMgbm90IHBlcmZvcm1lZC4KKwkgKi8KKworCWlmKChpc19jcHVfZmFtaWx5KCkgIT0gQ1BVX09NQVAzNlhYKSAmJgorCSAgIChzeXNfY2xraW5fc2VsID4gUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMXzE5XzJfTUhaKSkgeworCQlzeXNfY2xrX2RpdiA9IFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CWV8yOworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsIC8gMjsKKworCX0gZWxzZSB7CisJCXN5c19jbGtfZGl2ID0gUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzE7CisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwgLyAxOworCisJfQorCisJc3IzMihQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVCwKKwkJIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTLAorCQkgc3lzX2Nsa19kaXYpOworCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKworCX0gZWxzZSB7CisJCXNpbF9pbmRleCA9IGdldF9jcHVfcmV2KCkgLSAxOworCisJCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCQkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkJICogdGhlIHZhbHVlcyBmb3IgdGhhdCBpbnB1dCBzeXNjbGsgZnJvbSB0aGUgRFBMTCBwYXJhbSB0YWJsZQorCQkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkJICogYXBwcm9wcmlhdGUgc2lsaWNvbiByZXYuCisJCSAqLworCisJCS8qIFVubG9jayBNUFUgRFBMTCAoc2xvd3MgdGhpbmdzIGRvd24sIGFuZCBuZWVkZWQgbGF0ZXIpICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJCWRwbGwzX2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKworCQkvKiBMb2NrIE1QVSBEUExMIHRvIHNldCBmcmVxdWVuY3kgKi8KKwkJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7CisJCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisJfQorCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvbmVzdC9qNDkveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL25lc3QvajQ5L3gtbG9hZC5sZHMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBOZXN0IExhYnMsIEluYy4KKyAqICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBpcyB0aGUgWC1Mb2FkZXIgbGlua2VyIHNjYXR0ZXIgZmlsZSBmb3IgdGhlIE5lc3QKKyAqICAgICAgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKi8KKworLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKworCS4gPSBBTElHTig0KTsKKwkudGV4dCAgICAgIDoKKwl7CisJICBjcHUvb21hcDMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDIwYWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDE3MTBoMy5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllM2M3NgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMgRGF2aWQgTXVlbGxlciwgRUxTT0ZUIEFHLCA8ZC5tdWVsbGVyQGVsc29mdC5jaD4KKyMKKyMgKEMpIENvcHlyaWdodCAyMDA0CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMgS3NoaXRpaiBHdXB0YSA8S3NoaXRpakB0aS5jb20+CisjCisjIFRJIEgzIGJvYXJkIHdpdGggT01BUDE3MTAgKEFSTTkyNUVKUykgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgSW5ub3ZhdG9yIGhhcyAxIGJhbmsgb2YgMjU2IE1CIFNEUkFNCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDEwMDAnMDAwMCB0byAyMDAwJzAwMDAKKyMKKyMKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDEwMDAnODAwMCwgZW50cnkgMTAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorIworIyB3ZSBsb2FkIG91cnNlbGYgdG8gMTEwOCcwMDAwCisjCisjCisKK1BMQVRGT1JNX0xERkxBR1MgKz0gLW5vLXdhcm4tbWlzbWF0Y2gKK1RFWFRfQkFTRSA9IDB4MTEwODAwMDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9vbWFwMTcxMGgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1Y2ZlMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvb21hcDE3MTBoMy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIE1hcml1cyBHcm9lZ2VyIDxtZ3JvZWdlckBzeXNnby5kZT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIERhdmlkIE11ZWxsZXIsIEVMU09GVCBBRywgPGQubXVlbGxlckBlbHNvZnQuY2g+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorI2luY2x1ZGUgPC4vY29uZmlncy9vbWFwMTUxMC5oPgorI2VuZGlmCisgIAorI2RlZmluZSBDT01QX01PREVfRU5BQkxFICgodW5zaWduZWQgaW50KTB4MDAwMEVBRUYpCisKK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworI2lmZGVmIENGR19QUklOVEYgCisKKyAgCS8qIHNldHVwIGZvciBVQVJUMSAqLworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUZVTkNfTVVYX0NUUkxfMCkgJj0gfigweDAyMDAwMDAwKTsJLyogYml0IDI1ICovCisgIAkvKiBiaXQgMjkgZm9yIFVBUlQxICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpTU9EX0NPTkZfQ1RSTF8wKSAmPSB+KDB4MDAwMDIwMDApOworICAKKwkvKiBFbmFibGUgdGhlIHBvd2VyIGZvciBVQVJUMSAqLworI2RlZmluZSBVQVJUMV80OE1IWl9FTkFCTEUJKCh1bnNpZ25lZCBzaG9ydCkweDAyMDApCisjZGVmaW5lIFNXX0NMT0NLX1JFUVVFU1QJMHhGRkZFMDgzNAorCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopU1dfQ0xPQ0tfUkVRVUVTVCkgfD0gVUFSVDFfNDhNSFpfRU5BQkxFOworCisjZW5kaWYKKworIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClDT01QX01PREVfQ1RSTF8wKSA9IENPTVBfTU9ERV9FTkFCTEU7CisgIAlyZXR1cm4gMDsKK30KKworI2RlZmluZSBHUElPMV9ESVJFQ1RJT04JCTB4RkZGQkU0MzQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9GCQkweEZGRkUxMDk0CisjZGVmaW5lIFBVX1BEX1NFTF80CQkJMHhGRkZFMTBDNAorLyoKKyAqIE9uIEgzIGJvYXJkLCBOYW5kIFIvQiBpcyB0aWVkIHRvIEdQSU9fMTAKKyAqIFdlIHNldHVwIHRoaXMgR1BJTyBwaW4gCisgKi8KK2ludCBuYW5kX2luaXQgKHZvaWQpCit7CisgICAJCisgCS8qIEdQSU9fMTAgZm9yIGlucHV0LiBpdCBpcyBpbiBHUElPMSBtb2R1bGUgKi8KKyAJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpR1BJTzFfRElSRUNUSU9OKSB8PSAweDA0MDA7IAorCQorCS8qIEdQSU8xMCBGdW5jX01VWF9DVFJMIHJlZyBiaXQgMjk6MjcsIENvbmZpZ3VyZSBWMiB0byBtb2RlMSBhcyBHUElPICovCisJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKCh1bnNpZ25lZCBpbnQpRlVOQ19NVVhfQ1RSTF9GKSAmPSAweEM3RkZGRkZGOworCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopICgodW5zaWduZWQgaW50KUZVTkNfTVVYX0NUUkxfRikgfD0gMHgwODAwMDAwMDsKKwkgIAorCS8qIEdQSU8xMCBwdWxsdXAvZG93biByZWdpc3RlciwgRW5hYmxlIHB1bGx1cCBvbiBHUElPMTAgKi8KKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAoKHVuc2lnbmVkIGludClQVV9QRF9TRUxfNCkgfD0gMHgwODsKKyAJIAorIAlpZiAobmFuZF9jaGlwKCkpeworCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQore30KKyAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY0ZTNlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDE3MTBoMy9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIEtzaGl0aWogR3VwdGEgPEtzaGl0aWpAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKyNpbmNsdWRlIDwuL2NvbmZpZ3Mvb21hcDE1MTAuaD4KKyNlbmRpZgorCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKworCisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisJICogU2V0IHVwIEFSTSBDTE0gcmVnaXN0ZXJzIChJRExFQ1QxKSAgICAgICAgICAgICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QxCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDEKKwlzdHIJcjEsCVtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFNldCB1cCBBUk0gQ0xNIHJlZ2lzdGVycyAoSURMRUNUMikgIAkJICAgICAgICAqCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX0FSTV9JRExFQ1QyCisJbGRyCXIxLAlWQUxfQVJNX0lETEVDVDIKKwlzdHIJcjEsCVtyMF0KKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFNldCB1cCBBUk0gQ0xNIHJlZ2lzdGVycyAoSURMRUNUMykJCSAgICAgICAgKgorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlsZHIJcjAsCVJFR19BUk1fSURMRUNUMworCWxkcglyMSwJVkFMX0FSTV9JRExFQ1QzCisJc3RyCXIxLAlbcjBdCisKKworCW1vdglyMSwJIzB4MDUJCS8qIFBFUl9FTiBiaXQgKi8KKwlsZHIJcjAsCVJFR19BUk1fUlNUQ1QyCisJc3RyaAlyMSwJW3IwXQkJLyogQ0xLTTsgUGVyaXBoZXJhbCByZXNldC4gKi8KKworCS8qIFNldCBDTEtNIHRvIFN5bmMtU2NhbGFibGUJKi8KKwkvKiBJIHN1cHBvc2VkbHkgbmVlZCB0byBlbmFibGUgdGhlIGRzcCBjbG9jayBiZWZvcmUgc3dpdGNoaW5nICovCisJbGRyCXIxLAlWQUxfQVJNX1NZU1NUCisJbGRyCXIwLAlSRUdfQVJNX1NZU1NUCisJc3RyaAlyMSwJW3IwXQorCW1vdglyMCwJIzB4NDAwCisxOgorCXN1YnMJcjAsCXIwLAkjMHgxCS8qIHdhaXQgZm9yIGFueSBidWJibGVzIHRvIGZpbmlzaCAqLworCWJuZQkxYgorCWxkcglyMSwJVkFMX0FSTV9DS0NUTAorCWxkcglyMCwJUkVHX0FSTV9DS0NUTAorCXN0cmgJcjEsCVtyMF0KKworCS8qIGEgZmV3IG5vcHMgdG8gbGV0IHNldHRsZSAqLworCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCisJLyogc2V0dXAgRFBMTCAxICovCisJLyogUmFtcCB1cCB0aGUgY2xvY2sgdG8gOTZNaHogKi8KKwlsZHIJcjEsCVZBTF9EUExMMV9DVEwKKwlsZHIJcjAsCVJFR19EUExMMV9DVEwKKwlzdHJoCXIxLAlbcjBdCisJYW5kcwlyMSwJcjEsCSMweDEwCS8qIENoZWNrIGlmIFBMTCBpcyBlbmFibGVkLiAqLworCWJlcQlsb2NrX2VuZAkvKiBEbyBub3QgbG9vayBmb3IgbG9jayBpZiBCWVBBU1Mgc2VsZWN0ZWQgKi8KKzI6CisJbGRyaAlyMSwJW3IwXQorCWFuZHMJcjEsCXIxLAkjMHgwMQkvKglDaGVjayB0aGUgTE9DSyBiaXQuKi8KKwliZXEgMmIJCQkvKglsb29wIHVudGlsIGJpdCBnb2VzIGhpLiAqLworbG9ja19lbmQ6CisKKworCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCSAqIFR1cm4gb2ZmIHRoZSB3YXRjaGRvZyBkdXJpbmcgaW5pdC4uLgkJCSoKKyAJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCWxkcglyMCwJUkVHX1dBVENIRE9HCisJbGRyCXIxLAlXQVRDSERPR19WQUwxCisJc3RyCXIxLAlbcjBdCisJbGRyCXIxLAlXQVRDSERPR19WQUwyCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1NQUkRPRworCWxkcglyMSwJV1NQUkRPR19WQUwxCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1dQU0RPRworCit3YXRjaDFXYWl0OgorCWxkcglyMSwJW3IwXQorCXRzdAlyMSwJIzB4MTAKKwlibmUJd2F0Y2gxV2FpdAorCisJbGRyCXIwLAlSRUdfV1NQUkRPRworCWxkcglyMSwJV1NQUkRPR19WQUwyCisJc3RyCXIxLAlbcjBdCisJbGRyCXIwLAlSRUdfV1dQU0RPRword2F0Y2gyV2FpdDoKKwlsZHIJcjEsCVtyMF0KKwl0c3QJcjEsCSMweDEwCisJYm5lCXdhdGNoMldhaXQKKworCisJLyogU2V0IG1lbW9yeSB0aW1pbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5ldyBjbG9jayBzcGVlZCAqLworIAkgCisJLyoKKwkqIERlbGF5IGZvciBTRFJBTSBpbml0aWFsaXphdGlvbi4KKwkqLworCW1vdglyMywJIzB4MTgwMAkJLyogdmFsdWUgc2hvdWxkIGJlIGNoZWNrZWQgKi8KKzM6CisJc3VicwlyMywJcjMsCSMweDEJLyogRGVjcmVtZW50IGNvdW50ICovCisJYm5lIAkzYgorCisKKwkvKgorCSAqIFNldCBTRFJBTSBjb250cm9sIHZhbHVlcy4gRGlzYWJsZSByZWZyZXNoIGJlZm9yZSBNUlMgY29tbWFuZC4KKwkgKi8KKworCS8qIG1vYmlsZSBkZHIgb3BlcmF0aW9uICovCisJbGRyCXIwLAlSRUdfU0RSQU1fT1BFUkFUSU9OCisJbW92CXIyLAkjMDcKKwlzdHIJcjIsCVtyMF0KKworCS8qIGNvbmZpZyByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX0NPTkZJRworCWxkcglyMSwJU0RSQU1fQ09ORklHX1ZBTAorCXN0cglyMSwJW3IwXQorCisJLyogbWFudWFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KKwlsZHIJcjAsCVJFR19TRFJBTV9NQU5VQUxfQ01ECisJLyogaXNzdWUgc2V0IGNrZSBoaWdoICovCisJbW92CXIxLAkjQ01EX1NEUkFNX0NLRV9TRVRfSElHSAorCXN0cglyMSwJW3IwXQorCS8qIGlzc3VlIG5vcCAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9OT1AKKwlzdHIJcjEsCVtyMF0KKworCW1vdglyMiwJIzB4MDEwMAord2FpdE1ERFIxOgorCXN1YnMJcjIsCXIyLAkgIzEKKwlibmUJd2FpdE1ERFIxCS8qIGRlbGF5IGxvb3AgKi8KKworCS8qIGlzc3VlIHByZWNoYXJnZSAqLworCW1vdglyMSwJI0NNRF9TRFJBTV9QUkVDSEFSR0UKKwlzdHIJcjEsCVtyMF0KKworCisJLyogaXNzdWUgYXV0b3JlZnJlc2ggeCAyICovCisJbW92CXIxLAkjQ01EX1NEUkFNX0FVVE9SRUZSRVNICisJc3RyCXIxLAlbcjBdCisJc3RyCXIxLAlbcjBdCisKKwkvKiBtcnMgcmVnaXN0ZXIgZGRyIG1vYmlsZSAqLworCWxkcglyMCwJUkVHX1NEUkFNX01SUworCW1vdglyMSwJIzB4MzMKKwlzdHIJcjEsCVtyMF0KKworCS8qIGVtcnMxIGxvdy1wb3dlciByZWdpc3RlciAqLworCWxkcglyMCwJUkVHX1NEUkFNX0VNUlMxCisJLyogc2VsZiByZWZyZXNoIG9uIGFsbCBiYW5rcyAqLworCW1vdglyMSwJIzAKKwlzdHIJcjEsCVtyMF0KKworCWxkcglyMCwJUkVHX0RMTF9VUkRfQ09OVFJPTAorCWxkcglyMSwJRExMX1VSRF9DT05UUk9MX1ZBTAorCXN0cglyMSwJW3IwXQorCisJbGRyCXIwLAlSRUdfRExMX0xSRF9DT05UUk9MCisJbGRyCXIxLAlETExfTFJEX0NPTlRST0xfVkFMCisJc3RyCXIxLAlbcjBdCisKKwlsZHIJcjAsCVJFR19ETExfV1JUX0NPTlRST0wKKwlsZHIJcjEsCURMTF9XUlRfQ09OVFJPTF9WQUwKKwlzdHIJcjEsCVtyMF0KKworCS8qIGRlbGF5IGxvb3AgKi8KKwltb3YJcjIsCSMweDAxMDAKK3dhaXRNRERSMjoKKwlzdWJzCXIyLAlyMiwJIzEKKwlibmUJd2FpdE1ERFIyCisKKwkvKgorCSAqIERlbGF5IGZvciBTRFJBTSBpbml0aWFsaXphdGlvbi4KKwkgKi8KKwltb3YJcjMsCSMweDE4MDAKKzQ6CisJc3VicwlyMywJcjMsCSMxCS8qIERlY3JlbWVudCBjb3VudC4gKi8KKwlibmUJNGIKKwliCWNvbW1vbl90YworCitza2lwX3NkcmFtOgorCisJbGRyCXIwLAlSRUdfU0RSQU1fQ09ORklHCisJbGRyCXIxLAlTRFJBTV9DT05GSUdfVkFMCisJc3RyCXIxLAlbcjBdCisKKwkvKiBFbmFibGUgRU1JRkYgVEMgRG91YmxlciBpbiBPTUFQMTcxMCAqLworCWxkcglyMCwJUkVHX0VNSUZGX0RPVUJMRVIKKwltb3YJcjAsCSMweDE7CisKK2NvbW1vbl90YzoKKwkvKiBzbG93IGludGVyZmFjZSAqLworCWxkcglyMSwJVkFMX1RDX0VNSUZTX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NPTkZJRworCXN0cglyMSwJW3IwXQorCisjaWZkZWYgQ0ZHX0JPT1RfQ1MwCisJLyogQ2hpcCBTZWxlY3QgMyBmb3IgTkFORCovCisJbGRyCXIxLAlWQUxfVENfRU1JRlNfQ1MzX0NPTkZJRworCWxkcglyMCwJUkVHX1RDX0VNSUZTX0NTM19DT05GSUcKKwlzdHIJcjEsCVtyMF0gCisjZWxzZQorCS8qIENoaXAgU2VsZWN0IDIgZm9yIE5BTkQqLworCWxkcglyMSwJVkFMX1RDX0VNSUZTX0NTMl9DT05GSUcKKwlsZHIJcjAsCVJFR19UQ19FTUlGU19DUzJfQ09ORklHCisJc3RyCXIxLAlbcjBdIAorI2VuZGlmCisgIAorICAgICAgICAvKiBTdGFydCBNUFUgVGltZXIgMSAqLworICAgICAgICBsZHIgICAgIHIwLCAgICAgUkVHX01QVV9MT0FEX1RJTUVSCisgICAgICAgIGxkciAgICAgcjEsICAgICBWQUxfTVBVX0xPQURfVElNRVIKKyAgICAgICAgc3RyICAgICByMSwgICAgIFtyMF0KKworICAgICAgICBsZHIgICAgIHIwLCAgICAgUkVHX01QVV9DTlRMX1RJTUVSCisgICAgICAgIGxkciAgICAgcjEsICAgICBWQUxfTVBVX0NOVExfVElNRVIKKyAgICAgICAgc3RyICAgICByMSwgICAgIFtyMF0KKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworCitSRUdfVENfRU1JRlNfQ09ORklHOgkJLyogMzIgYml0cyAqLworCS53b3JkIDB4ZmZmZWNjMGMKKyNpZmRlZiBDRkdfQk9PVF9DUzAKK1JFR19UQ19FTUlGU19DUzNfQ09ORklHOgkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MxYworI2Vsc2UKK1JFR19UQ19FTUlGU19DUzJfQ09ORklHOgkvKiAzMiBiaXRzICovCisJLndvcmQgMHhmZmZlY2MxOAorI2VuZGlmCisgCisvKiBNUFUgY2xvY2svcmVzZXQvcG93ZXIgbW9kZSBjb250cm9sIHJlZ2lzdGVycyAqLworUkVHX0FSTV9DS0NUTDoJCQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UwMAorCitSRUdfQVJNX0lETEVDVDM6CQkvKiAxNiBiaXRzICovCisJLndvcmQgMHhmZmZlY2UyNAorUkVHX0FSTV9JRExFQ1QyOgkJLyogMTYgYml0cyAqLworCS53b3JkIDB4ZmZmZWNlMDgKK1JFR19BUk1fSURMRUNUMToJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTA0CisKK1JFR19BUk1fUlNUQ1QyOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTE0CitSRUdfQVJNX1NZU1NUOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZTE4CisvKiBEUExMIGNvbnRyb2wgcmVnaXN0ZXJzICovCitSRUdfRFBMTDFfQ1RMOgkJCS8qIDE2IGJpdHMgKi8KKwkud29yZCAweGZmZmVjZjAwCisKKy8qIFdhdGNoIERvZyByZWdpc3RlciAqLworLyogc2VjdXJlIHdhdGNoZG9nIHN0b3AgKi8KK1JFR19XU1BSRE9HOgorCS53b3JkIDB4ZmZmZWIwNDgKKy8qIHdhdGNoZG9nIHdyaXRlIHBlbmRpbmcgKi8KK1JFR19XV1BTRE9HOgorCS53b3JkIDB4ZmZmZWIwMzQKKworV1NQUkRPR19WQUwxOgorCS53b3JkIDB4MDAwMGFhYWEKK1dTUFJET0dfVkFMMjoKKwkud29yZCAweDAwMDA1NTU1CisKKy8qIFNEUkFNIGNvbmZpZyBpczogYXV0byByZWZyZXNoIGVuYWJsZWQsIDE2IGJpdCA0IGJhbmssCisgY291bnRlciBAODE5MiByb3dzLCAxMCBucywgOCBidXJzdCAqLworUkVHX1NEUkFNX0NPTkZJRzoKKwkud29yZCAweGZmZmVjYzIwCisKKy8qIE9wZXJhdGlvbiByZWdpc3RlciAqLworUkVHX1NEUkFNX09QRVJBVElPTjoKKwkud29yZCAweGZmZmVjYzgwCisKK1JFR19FTUlGRl9ET1VCTEVSOgorCS53b3JkIDB4ZmZmZWNjNjAKKworLyogTWFudWFsIGNvbW1hbmQgcmVnaXN0ZXIgKi8KK1JFR19TRFJBTV9NQU5VQUxfQ01EOgorCS53b3JkIDB4ZmZmZWNjODQKKworLyogU0RSQU0gTVJTIChOZXcpIGNvbmZpZyBpczogQ0FTIGxhdGVuY3kgaXMgMiwgYnVyc3QgbGVuZ3RoIDggKi8KK1JFR19TRFJBTV9NUlM6CisJLndvcmQgMHhmZmZlY2M3MAorCisvKiBTRFJBTSBNUlMgKE5ldykgY29uZmlnIGlzOiBDQVMgbGF0ZW5jeSBpcyAyLCBidXJzdCBsZW5ndGggOCAqLworUkVHX1NEUkFNX0VNUlMxOgorCS53b3JkIDB4ZmZmZWNjNzgKKworLyogV1JUIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9XUlRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjYzY0CitETExfV1JUX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDM1MDAwMDIKKworLyogVVJEIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9VUkRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjY2MwCitETExfVVJEX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDAwMDAwMDYKKworLyogTFJEIERMTCByZWdpc3RlciAqLworUkVHX0RMTF9MUkRfQ09OVFJPTDoKKwkud29yZCAweGZmZmVjY2NjCisKK1JFR19XQVRDSERPRzoKKwkud29yZCAweGZmZmVjODA4CisKK1JFR19NUFVfTE9BRF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZlYzYwMAorUkVHX01QVV9DTlRMX1RJTUVSOgorICAgICAgICAud29yZCAweGZmZmVjNTAwCisKKy8qIDk2IE1IeiBTYW1zdW5nIE1vYmlsZSBERFIgKi8KK1NEUkFNX0NPTkZJR19WQUw6CisJLndvcmQgMHgwYzAyOGFmNAorCitETExfTFJEX0NPTlRST0xfVkFMOgorCS53b3JkIDB4MDAwMDAwMDYKKworVkFMX0FSTV9DS0NUTDoKKwkud29yZCAweDM1MGUKK1ZBTF9BUk1fU1lTU1Q6CisJLndvcmQgMHgxMDAxCisKK1ZBTF9EUExMMV9DVEw6CisJLndvcmQgMHgyODEwCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKK1ZBTF9UQ19FTUlGU19DT05GSUc6CisJLndvcmQgMHgwMDAwMDAxMCAKK1ZBTF9UQ19FTUlGU19DUzNfQ09ORklHOgkKKyAJLndvcmQgMHhmZjgwZmZmMyAgIAorI2Vsc2UKK1ZBTF9UQ19FTUlGU19DT05GSUc6CisJLndvcmQgMHgwMDAwMDAxMiAgIC8qc3dhcCBDUzAvQ1MzIGFkZHJlc3NpbmcgKi8KK1ZBTF9UQ19FTUlGU19DUzJfQ09ORklHOgkKKyAJLndvcmQgMHhmZjgwZmZmMyAgIAorI2VuZGlmCisKKyAKK1ZBTF9UQ19FTUlGRl9TRFJBTV9DT05GSUc6CisJLndvcmQgMHgwMTAyOTBmYworVkFMX1RDX0VNSUZGX01SUzoKKwkud29yZCAweDAwMDAwMDI3CisKK1ZBTF9BUk1fSURMRUNUMToKKwkud29yZCAweDAwMDAxNGM2CisKK1ZBTF9BUk1fSURMRUNUMjoKKwkud29yZCAweDAwMDAwOWZmCitWQUxfQVJNX0lETEVDVDM6CisJLndvcmQgMHgwMDAwMDAzZgorCitXQVRDSERPR19WQUwxOgorCS53b3JkIDB4MDAwMDAwZjUKK1dBVENIRE9HX1ZBTDI6CisJLndvcmQgMHgwMDAwMDBhMAorCitWQUxfTVBVX0xPQURfVElNRVI6CisgICAgICAgIC53b3JkIDB4ZmZmZmZmZmYKK1ZBTF9NUFVfQ05UTF9USU1FUjoKKyAgICAgICAgLndvcmQgMHhmZmZmZmZhMQorCisvKiBjb21tYW5kIHZhbHVlcyAqLworLmVxdSBDTURfU0RSQU1fTk9QLAkJMHgwMDAwMDAwMAorLmVxdSBDTURfU0RSQU1fUFJFQ0hBUkdFLAkweDAwMDAwMDAxCisuZXF1IENNRF9TRFJBTV9BVVRPUkVGUkVTSCwJMHgwMDAwMDAwMgorLmVxdSBDTURfU0RSQU1fQ0tFX1NFVF9ISUdILAkweDAwMDAwMDA3CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMTcxMGgzL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NGVlYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAxNzEwaDMveC1sb2FkLmxkcwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworT1VUUFVUX0ZPUk1BVCgiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iKQorT1VUUFVUX0FSQ0goYXJtKQorRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKwkuID0gMHgwMDAwMDAwMDsKKwkuID0gQUxJR04oNCk7CisJLnRleHQJOgorCXsKKwkgIGNwdS9hcm05MjZlanMvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisgCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L01ha2VmaWxlIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQ3NDI4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAyNDIwaDQubyAKK1NPQkpTCTo9IHBsYXRmb3JtLm8KKworJChMSUIpOgkkKE9CSlMpICQoU09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitjbGVhbjoKKwlybSAtZiAkKFNPQkpTKSAkKE9CSlMpCisKK2Rpc3RjbGVhbjoJY2xlYW4KKwlybSAtZiAkKExJQikgY29yZSAqLmJhayAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzcwZjMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L2NvbmZpZy5tawpAQCAtMCwwICsxLDI2IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNAorIyBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisjCisjIFRJIEg0IGJvYXJkIHdpdGggT01BUDI0MjAgKEFSTTExMzYpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciA2NE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIEg0IGhhcyAxIGJhbmsgb2YgMzJNQiBvciAwME1CIG1ERFItU0RSQU0gb24gQ1MxCisjIFBoeXNpY2FsIEFkZHJlc3M6CisjIDgwMDAnMDAwMCAoYmFuazApCisjIEEwMDAvMDAwMCAoYmFuazEpIEVTMiB3aWxsIGJlIGNvbmZpZ3VyYWJsZQorIyBMaW51eC1LZXJuZWwgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgODAwMCc4MDAwLCBlbnRyeSA4MDAwJzgwMDAKKyMgKG1lbSBiYXNlICsgcmVzZXJ2ZWQpCisKKyMgRm9yIHVzZSB3aXRoIGV4dGVybmFsIG9yIGludGVybmFsIGJvb3RzLgorIyBDT05GSUdfUEFSVElBTF9TUkFNIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgdGhpcy4KK1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBVc2VkIHdpdGggZnVsbCBTUkFNIGJvb3QuCisjIFRoaXMgaXMgZWl0aGVyIHdpdGggYSBHUCBzeXN0ZW0gb3IgYSBzaWduZWQgYm9vdCBpbWFnZS4KKyMgZWFzaWVzdCwgYW5kIHNhZmVzdCB3YXkgdG8gZ28gaWYgeW91IGNhbi4KKyMgQ29tbWVudCBvdXQgLy9DT05GSUdfUEFSVElBTF9TUkFNIGZvciB0aGlzIG9uZS4KKyMKKyNURVhUX0JBU0UgPSAweDQwMjgwMDAwCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9vbWFwMjQyMGg0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MWI0OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvb21hcDI0MjBoNC5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDIwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSk7CitzdGF0aWMgdm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpOworc3RhdGljIHZvaWQgcGVyaXBoZXJhbF9lbmFibGUodm9pZCk7CitzdGF0aWMgdm9pZCBtdXhTZXR1cFVBUlQxKHZvaWQpOworc3RhdGljIHUzMiAgZ2V0X2NwdV9yZXYodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENGR19TRFJBTV9ERFIKK3ZvaWQKK2NvbmZpZ19zZHJhbV9kZHIodTMyIHJldikKK3sKKwkvKiBiYWxsIEQxMSwgbW9kZSAwICovCisJX19yYXdfd3JpdGViKDB4MDgsIDB4NDgwMDAwMzIpOworCisJLyogU0RSQ19DUzAgQ29uZmlndXJhdGlvbiAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJfSBlbHNlIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJfQorCisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIFNEUkNfUkZSX0NUUkwpOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEFfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQl8wX0VTMSwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCS8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCisJLyogCisJICogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlcgorCSAqIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5CisJICogU2VyaWFsIG1vZGUKKwkgKiBDQVMgbGF0ZW5jeSA9IDMgCisJICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMzIsIFNEUkNfTVJfMCk7CisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAwMDA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9CisKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fRERSCisKKworI2lmZGVmIENGR19TRFJBTV9DT01CTyAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9jb21ibyh1MzIgcmV2KQoreworCisJdTMyIGRsbGN0cmw9MDsKKworICAgICAgICAvKiBiYWxsIEMxMiwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGExKTsKKyAgICAgICAgLyogYmFsbCBEMTEsIG1vZGUgMCAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDAzMik7CisgICAgICAgIC8qIGJhbGwgQjEzLCBtb2RlIDAgLSBmb3IgQ0tFMSAobm90IG5lZWRlZCBya3cgZm9yIGNvbWJvKSAqLworICAgICAgICBfX3Jhd193cml0ZWIoMHgwMCwgMHg0ODAwMDBhMyk7CisKKyAgICAgICAgLypjb25maWd1cmUgc2RyYyAzMiBiaXQgZm9yIENPTUJPIGRkciBzZHJhbS4gSXNzdWUgc29mdCByZXNldCAqLworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMiwgU0RSQ19TWVNDT05GSUcpOworICAgICAgICBkZWxheSgyMDAwMDApOworICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisgICAgICAgIC8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCisgICAgICAgIC8qIENTMCBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworICAgICAgICAvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisgICAgICAgIC8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjJfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKyAgICAgICAgLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisgICAgICAgIC8qIENvbmZpZ3VyZSB0byBNVVg5OiAxeDhNYngzMiAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9DT01CT19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6LCBTRFJDX0FDVElNX0NUUkxBXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMSk7CisJX19yYXdfd3JpdGVsKEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEsIDB4NjgwMDkwZDQpOworCisgICAgICAgIC8qIE1hbnVhbCBDb21tYW5kIHNlcXVlbmNlICovCisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzEpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8xKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisKKyAgICAgICAgLyogQ1MxIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDQgLSBERFIgbWVtb3J5ICovCisgICAgICAgIC8qIFNlcmlhbCBtb2RlICovCisgICAgICAgIC8qIENBUyBsYXRlbmN5ID0gMyAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzEpOworCisgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgIC8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKwkJZGxsY3RybCA9IChCSVQwfEJJVDMpOworCWVsc2UKKwkJZGxsY3RybCA9IEJJVDA7CQkKKworICAgICAgICBpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQV9DVFJMKTsKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2FkIGN0ciB2YWx1ZSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvY2sgYW5kIGdvICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7ICAgLy8gRVMyLngKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQV9DVFJMKTsgLy8gRVMyLngKKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQl9DVFJMKTsgICAvLyBFUzIueCA/CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICYgfihMT0FERExMfGRsbGN0cmwpLCBTRFJDX0RMTEJfQ1RSTCk7IC8vIEVTMi54CisgICAgICAgIH0KK30KKworI2VuZGlmIC8vIENGR19TRFJBTV9DT01CTworCisjaWZkZWYgQ0ZHX1NEUkFNX1NEUiAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zZHIodTMyIHJldikKK3sKKwl1MzIgZGxsY3RybD0wOworCisJLyogYmFsbCBEMTEsIG1vZGUgMCAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogQ2hpcC1sZXZlbCBzaGFyZWQgaW50ZXJmYWNlIG1hbmFnZW1lbnQgKi8KKwkvKiBTRFJDVHJpU3RhdGU6IG5vIFRyaXMgKi8KKwkvKiBDUzBNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwkvKiBDUzFNdXhDZmc6IDAwMCAoMzItYml0IFNEUkFNIG9uIEQzMS4uMCkgKi8KKwlpZiAocmV2ID09IENQVV8yNDIwXzI0MjJfRVMxKQorCQlfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBDUzAgU0RSQyBNZW1vcnkgQ29uZmlndXJhdGlvbiwgKi8KKwkvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKwkvKiBDb25maWd1cmUgdG8gTVVYMTQ6IDMyTWJ4MzIgKi8KKwlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX01EQ0ZHXzBfU0RSLCBTRFJDX01DRkdfMCk7IC8qIGRpZmYgZnJvbSBjb21ibyBjYXNlICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgU0RSQ19SRlJfQ1RSTCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgCisJLyogQ1MwIFNEUkMgTW9kZSBSZWdpc3RlciAqLworCS8qIEJ1cnN0IGxlbmd0aCA9IDIgLSBTRFIgbWVtb3J5ICovCisJLyogU2VyaWFsIG1vZGUgKi8KKwkvKiBDQVMgbGF0ZW5jeSA9IDMgICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NUl8wX1NEUiwgU0RSQ19NUl8wKTsgIC8qIGRpZmYgZnJvbSBjb21ibyBjYXNlICovCisKKwkvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisKKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgICAgICAgICBkbGxjdHJsID0gKEJJVDB8QklUMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkbGxjdHJsID0gQklUMDsKKworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDYsIFNEUkNfRExMQV9DVFJMKTsKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQV9DVFJMKTsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2FkIGN0ciB2YWx1ZSAqLworCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExCX0NUUkwpOyAvKiBsb2NrIGFuZCBnbyAqLworCX0KKwllbHNlIHsKKwkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCQlfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgJiB+KExPQURETEx8ZGxsY3RybCksIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9CisgICAKK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU0RSCisKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRCAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zdGFja2VkKHUzMiByZXYpCit7CisKKwkvKiBQaW4gTXV4aW5nIGZvciBTRFJDICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOwkvKiBtdXggbW9kZSAwIChDUzEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOwkvKiBtdXggbW9kZSAwIChDS0UxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsJLyogY29ubmVjdCBzZHJjX2ExMiAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMxKTsJLyogY29ubmVjdCBzZHJjX2ExMyAqLworCisJLyogY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBubyBpZGxlIGFjayBhbmQgUkVTRVQgZW5hYmxlICovCisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlIG1vZGUgKi8KKworCS8qIFNEUkNfU0hBUklORyAqLworCS8qIFUtYm9vdCBpcyB3cml0aW5nIDB4MDAwMDAxMDAgdGhvdWdoIChINF8yNDIwX1NEUkNfU0hBUklORyApICovCisJLy9fX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwlfX3Jhd193cml0ZWwoMHgwMDAwNDkwMCwgU0RSQ19TSEFSSU5HKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwkvKiBOb25lIGZvciBFUzIuMSAqLworCisJLyogIFNEUkNfQ1MxIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19DU19DRkcpOwkvKiBSZW1hcCBDUzEgdG8gMHg4MDAwMDAwMCAqLworCisJLyogRGlzYWJsZSBwb3dlciBkb3duIG9mIENLRSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDg1LCBTRFJDX1BPV0VSKTsKKworCV9fcmF3X3dyaXRlbCgweDAxQTAyMDE5LCBTRFJDX01DRkdfMSk7CS8qIFNEUkNfTUNGRzEgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAzREQwMywgU0RSQ19SRlJfQ1RSTDEpOwkvKiBTRFJDX1JGUl9DVFJMMSAqLworCV9fcmF3X3dyaXRlbCgweDkyRERDNDg1LCBTRFJDX0FDVElNX0NUUkxBXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxBMCAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDE0LCBTRFJDX0FDVElNX0NUUkxCXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxCMCAqLworCisJLypNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8xKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMSk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMSk7CisKKwkvKiBDUzAgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKwkvKiBTZXJpYWwgbW9kZSAqLworCS8qIENBUyBsYXRlbmN5ID0gMyAgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAzMiwgU0RSQ19NUl8xKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAyMCwgU0RSQ19FTVIyXzEpOwkvKiB3ZWFrLXN0cmVuZ3RoIGRyaXZlciAqLworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTE1IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwNzMwMiwgU0RSQ19ETExBX0NUUkwpOworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMjggKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEJfQ1RSTCk7CisJfQorCWVsc2UgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDAzMTA4LCBTRFJDX0RMTEFfQ1RSTCk7CS8vIEVTMi54CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQl9DVFJMKTsJLy8gRVMyLngKKwl9Cit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX1NUQUNLRUQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzX2luaXQoaW50IHNraXApCit7CisJdTMyICAgcmV2OworCisJcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworCXdhdGNoZG9nX2luaXQoKTsKKwltdXhTZXR1cFVBUlQxKCk7CisJZGVsYXkoMTAwKTsKKworCS8qRFBMTCBvdXQgPSAyeCBEUExMIC0tPiBjb3JlIGNsb2NrICovCisJX19yYXdfd3JpdGVsKERQTExfT1VULCBDTV9DTEtTRUwyX1BMTCk7CisKKwkvKkRQTEwgaW50byBsb3cgcG93ZXIgYnlwYXNzIChvdGhlcnMgb2ZmKSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAxLCBDTV9DTEtFTl9QTEwpOworCisJLypNUFUgY29yZSBjbG9jayA9IENvcmUgLzIgPSAzMDAgKi8KKwlfX3Jhd193cml0ZWwoTVBVX0RJViwgQ01fQ0xLU0VMX01QVSk7CisKKwkvKkRTUGlmPTIwMCwgRFNQaWY9MTAwLCBJVkE9MjAwICovCisJX19yYXdfd3JpdGVsKERTUF9ESVYsIENNX0NMS1NFTF9EU1ApOworCisJLypHRlggY2xvY2sgKEwzLzIpIDUwTUh6ICovCisJX19yYXdfd3JpdGVsKEdGWF9ESVYsIENNX0NMS1NFTF9HRlgpOworCisJLypMMz0xMDAsIEw0PTEwMCwgRGlzcGxheVNTPTUwIFZseW5jPTk2TWh6LHNzaT0xMDAsIHVzYj01MCAqLworCV9fcmF3X3dyaXRlbChCVVNfRElWLCBDTV9DTEtTRUwxX0NPUkUpOworCisJLyoxMk1IeiBhcGxsIHNyYywgMTIvKDErMSkqNTA9MzAwICovCisJX19yYXdfd3JpdGVsKERQTExfVkFMLCBDTV9DTEtTRUwxX1BMTCk7CisKKwkvKlZhbGlkIHRoZSBjb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIFBSQ01fQ0xLQ0ZHX0NUUkwpOworCWRlbGF5KDEwMDApOworCisJLypFbmFibGUgRFBMTD0zMDAsIDk2TUh6IEFQTEwgbG9ja2VkLiAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDBGLCBDTV9DTEtFTl9QTEwpOworCWRlbGF5KDIwMDAwMCk7CisKKyNpZmRlZiBDRkdfU0RSQU1fRERSCisJY29uZmlnX3NkcmFtX2RkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fQ09NQk8pCisJY29uZmlnX3NkcmFtX2NvbWJvKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TRFIpCisJY29uZmlnX3NkcmFtX3NkcihyZXYpOworI2VsaWYgZGVmaW5lZChDRkdfU0RSQU1fU1RBQ0tFRCkKKwljb25maWdfc2RyYW1fc3RhY2tlZChyZXYpOworI2Vsc2UKKyNlcnJvciBTRFJBTSB0eXBlIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgkKKworCWRlbGF5KDIwMDAwKTsKKwlwZXJpcGhlcmFsX2VuYWJsZSgpOworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YXRjaGRvZ19pbml0CisgKiBEZXNjcmlwdGlvbjogU2h1dCBkb3duIHdhdGNoIGRvZ3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKyNkZWZpbmUgR1AgKEJJVDh8QklUOSkKKworCS8qIFRoZXJlIGFyZSA0IHdhdGNoIGRvZ3MuICAxIHNlY3VyZSwgYW5kIDMgZ2VuZXJhbCBwdXJwb3NlLgorCSAqIEkgd291bGQgZXhwZWN0IHRoYXQgdGhlIFJPTSB0YWtlcyBjYXJlIG9mIHRoZSBzZWN1cmUgb25lLAorCSAqIGJ1dCB3ZSB3aWxsIHRyeSBhbHNvLiAgT2YgdGhlIDMgR1Agb25lcywgMSBjYW4gcmVzZXQgdXMKKwkgKiBkaXJlY3RseSwgdGhlIG90aGVyIDIgb25seSBnZW5lcmF0ZSBNUFUgaW50ZXJydXB0cy4KKwkgKi8KKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0QyX0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdEMl9CQVNFK1dTUFIpOworCisjaWYgTVBVX1dEX0NMT0NLRUQgLyogdmFsdWUgMHgxMCBzdGljayBvbiBhcHRpeCwgQklUNCBwb2xhcml0eSBzZWVtcyBvcHBzaXRlKi8KKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSAsV0QzX0JBU0UrV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDNfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIgLFdEM19CQVNFK1dTUFIpOworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEgLFdENF9CQVNFK1dTUFIpOworCXdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUoV0Q0X0JBU0UpOworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0syICxXRDRfQkFTRStXU1BSKTsKKyNlbmRpZgorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UrV1dQUyk7CisJfSB3aGlsZSAocGVuZGluZyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2LCBpZl9jbGtzPTAsIGZ1bmNfY2xrcz0wOworCisJLyogRW5hYmxlIEdQMiB0aW1lci4qLworCWlmX2Nsa3MgfD0gQklUNDsKKwlmdW5jX2Nsa3MgfD0gQklUNDsKKwl2ID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMMl9DT1JFKSB8IDB4NDsJLyogU3lzX2NsayBpbnB1dCBPTUFQMjQyMF9HUFQyICovCisJX19yYXdfd3JpdGVsKHYsIENNX0NMS1NFTDJfQ09SRSk7CisJX19yYXdfd3JpdGVsKDB4MSwgQ01fQ0xLU0VMX1dLVVApOworCisjaWZkZWYgQ0ZHX05TMTY1NTAKKwkvKiBFbmFibGUgVUFSVDEgY2xvY2sgKi8KKwlmdW5jX2Nsa3MgfD0gQklUMjE7CisJaWZfY2xrcyB8PSBCSVQyMTsKKyNlbmRpZgorCXYgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU4xX0NPUkUpIHwgaWZfY2xrczsJLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LENNX0lDTEtFTjFfQ09SRSApOworCXYgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU4xX0NPUkUpIHwgZnVuY19jbGtzOyAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworCV9fcmF3X3dyaXRlbCh2LCBDTV9GQ0xLRU4xX0NPUkUpOworCWRlbGF5KDEwMDApOworCisjaWZuZGVmIEtFUk5FTF9VUERBVEVECisJeworI2RlZmluZSBWMSAweGZmZmZmZmZmCisjZGVmaW5lIFYyIDB4MDAwMDAwMDcKKworCQlfX3Jhd193cml0ZWwoVjEsIENNX0ZDTEtFTjFfQ09SRSk7CisJCV9fcmF3X3dyaXRlbChWMiwgQ01fRkNMS0VOMl9DT1JFKTsKKwkJX19yYXdfd3JpdGVsKFYxLCBDTV9JQ0xLRU4xX0NPUkUpOworCQlfX3Jhd193cml0ZWwoVjEsIENNX0lDTEtFTjJfQ09SRSk7CisJfQorI2VuZGlmCisKK30KKworLyogUGluIE11eGluZyByZWdpc3RlcnMgdXNlZCBmb3IgVUFSVDEgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX0NUUyAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM1KQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfUlRTICAgICAgICgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKTB4NDgwMDAwQzYpCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9UWCAgICAgICAgKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopMHg0ODAwMDBDNykKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQxX1JYICAgICAgICAoKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikweDQ4MDAwMEM4KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG11eFNldHVwVUFSVDEgIChvc3Rib290KQorICogRGVzY3JpcHRpb246IFNldCB1cCB1YXJ0MSBtdXhpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG11eFNldHVwVUFSVDEodm9pZCkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICAqTXV4Q29uZmlnUmVnOworCisJLyogVUFSVDFfQ1RTIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBEMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9DVFM7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfUlRTIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBIMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9SVFM7CisJKk11eENvbmZpZ1JlZyA9IDB4MDAgOyAvKiBNb2RlID0gMCwgUFVQRD1EaXNhYmxlZCAqLworCisJLyogVUFSVDFfVFggcGluIGNvbmZpZ3VyYXRpb24sIFBJTiA9IEwyMCAqLworCU11eENvbmZpZ1JlZyA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopQ09OVFJPTF9QQURDT05GX1VBUlQxX1RYOworCSpNdXhDb25maWdSZWcgPSAweDAwIDsgLyogTW9kZSA9IDAsIFBVUEQ9RGlzYWJsZWQgKi8KKworCS8qIFVBUlQxX1JYIHBpbiBjb25maWd1cmF0aW9uLCBQSU4gPSBUMjEgKi8KKwlNdXhDb25maWdSZWcgPSAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUNPTlRST0xfUEFEQ09ORl9VQVJUMV9SWDsKKwkqTXV4Q29uZmlnUmVnID0gMHgwMCA7IC8qIE1vZGUgPSAwLCBQVVBEPURpc2FibGVkICovCit9CisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwl1MzIJcmV2OworCisJcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworCisJLyogR1BNQyBwaW4gbXV4aW5nICovIAorCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3MCkgJj0gMHgwMDAwMDBGRjsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwNzQpICY9IDB4MDAwMDAwMDA7CisJKCoodm9sYXRpbGUgaW50KikweDQ4MDAwMDc4KSAmPSAweDAwMDAwMDAwOworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA3QykgJj0gMHgwMDAwMDAwMDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NDgwMDAwODApICY9IDB4RkYwMDAwMDA7CisKKwkvKiBHUE1DX0lPX0RJUiAqLworCSgqKHZvbGF0aWxlIGludCopMHg0ODAwMDA4QykgPSAweDE5MDAwMDAwOworCisJLyogR1BNQyBDb25maWd1cmF0aW9uICovCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDEwKSA9IDB4MDAwMDAwMEE7CisJd2hpbGUgKCgoKih2b2xhdGlsZSBpbnQgKikweDY4MDBBMDE0KSAmIDB4MDAwMDAwMDEpID09IDApOworCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDUwKSA9IDB4MDAwMDAwMDE7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2MCkgPSAweDAwMDAxODAwOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNjQpID0gMHgwMDE0MTQwMDsJCisJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDY4KSA9IDB4MDAxNDE0MDA7CQorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA2QykgPSAweDBGMDEwRjAxOwkKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzApID0gMHgwMTBDMTQxNDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzQpID0gMHgwMDAwMEE4MDsKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwNzgpID0gMHgwMDAwMEM0NDsgCS8vYmFzZSAweDA0MDAwMDAwCisKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwQTgpID0gMHgwMDAwMDAwMDsKKwlkZWxheSgxMDAwKTsKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRAorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5MCkgPSAweDAwMDExMDAwOworI2Vsc2UKKwkoKih2b2xhdGlsZSBpbnQqKTB4NjgwMEEwOTApID0gMHgwMDAxMTIwMDsKKyNlbmRpZgorCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5NCkgPSAweDAwMWYxZjAwOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5OCkgPSAweDAwMDgwODAyOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTA5QykgPSAweDFDMDkxQzA5OworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBMCkgPSAweDAzMUExRjFGOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBNCkgPSAweDAwMDAwM0MyOworCSgqKHZvbGF0aWxlIGludCopMHg2ODAwQTBBOCkgPSAweDAwMDAwRjQ4OworCisJaWYgKHJldiAhPSBDUFVfMjQyMF8yNDIyX0VTMSkKKwkJKCoodm9sYXRpbGUgaW50KikweDY4MDBBMDQwKSA9IDB4MUZGMDsJLy8gZXMyLngKKworIAlpZiAobmFuZF9jaGlwKCkpeworCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisgICAgICAgIHUzMiB2OworICAgICAgICB2ID0gX19yYXdfcmVhZGwoVEFQX0lEQ09ERV9SRUcpOworICAgICAgICB2ID0gdiA+PiAyODsKKyAgICAgICAgcmV0dXJuKHYrMSk7ICAvKiBjdXJyZW50bHkgMjQyMiBhbmQgMjQyMCBtYXRjaCB1cCAqLworfQorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQore30KKworCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2MzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MjBoNC9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQyMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmZGVmIENPTkZJR19QQVJUSUFMX1NSQU0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gUFJDTV9DTEtDRkdfQ1RSTCAtIGFkZHIgb2YgdmFsaWQgcmVnCisgKiAgUjEgPSBDTV9DTEtFTl9QTEwgLSBhZGRyIGRwbGwgY3RsciByZWcKKyAqICBSMiA9IGRwbGwgdmFsdWUKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdWIgICAgIHNwLCBzcCwgIzB4NCAvKiBnZXQgc29tZSBzdGFjayBzcGFjZSAqLworICAgICAgICBzdHIgICAgIHI0LCBbc3BdICAgICAvKiBzYXZlIHI0J3MgdmFsdWUgKi8KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjgsIHBsbF9jdGxfYWRkCisgICAgICAgIG1vdiAgICAgcjQsICMweDIKKyAgICAgICAgc3RyICAgICByNCwgW3I4XQorICAgICAgICBsZHIgICAgIHI0LCBwbGxfc3RhdAorYmxvY2s6CisgICAgICAgIGxkciAgICAgcjgsIFtyNF0JLyogd2FpdCBmb3IgYnlwYXNzIHRvIHRha2UgZWZmZWN0ICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHgzCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgYm5lICAgICBibG9jaworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNCwgcGxsX2Rpdl9hZGQKKwlsZHIgICAgIHI4LCBwbGxfZGl2X3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNCwgY2ZnM18wX2FkZHIKKyAgICAgICAgbGRyICAgICByOCwgY2ZnM18wX3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgICAgIGxkciAgICAgcjQsIGNmZzRfMF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGNmZzRfMF92YWwKKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorICAgICAgICBsZHIgICAgIHI0LCBjZmcxXzBfYWRkcgorICAgICAgICBsZHIgICAgIHI4LCBbcjRdCisgICAgICAgIG9yciAgICAgcjgsIHI4LCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByOCwgW3I0XQorCisJLyogc2V0dXAgdG8gMnggbG9vcCB0aG91Z2ggY29kZS4gIFRoZSBmaXJzdCBsb29wIHByZS1sb2FkcyB0aGUgCisgICAgICAgICAqIGljYWNoZSwgdGhlIDJuZCBjb21taXRzIHRoZSBwcmNtIGNvbmZpZywgYW5kIGxvY2tzIHRoZSBkcGxsCisgICAgICAgICAqLworICAgICAgICBtb3YgICAgIHI0LCAjMHgxMDAwICAgICAgLyogc3BpbiBzcGluIHNwaW4gKi8KKyAgICAgICAgbW92ICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHBhc3MgY29uZGl0aW9uICYgc2V0IHJlZ2lzdGVycyAqLworICAgICAgICBjbXAgICAgIHI4LCAjMHg0CisyOgorICAgICAgICBsZHJuZSAgIHI4LCBbcjNdICAgICAgICAgLyogRFBMTCBsb2NrIGNoZWNrICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHg3CisgICAgICAgIGNtcCAgICAgcjgsICMweDIKKyAgICAgICAgYmVxICAgICA0ZgorMzoKKyAgICAgICAgc3ViZXEgICByOCwgcjgsICMweDEKKyAgICAgICAgc3RyZXEgICByOCwgW3IwXSAgICAgICAgIC8qIGNvbW1pdCBkaXZpZGVycyAoMm5kIHRpbWUpICovCisgICAgICAgIG5vcAorbGxvb3AxOgorICAgICAgICBzdWIgICAgIHI0LCByNCwgIzB4MSAgICAvKiBMb29wIGN1cnJlbnRseSBuZWNlc3NhcnkgZWxzZSBiYWQganVtcHMgKi8KKyAgICAgICAgbm9wCisgICAgICAgIGNtcCAgICAgcjQsICMweDAKKyAgICAgICAgYm5lICAgICBsbG9vcDEKKyAgICAgICAgbW92ICAgICByNCwgIzB4NDAwMDAKKyAgICAgICAgY21wICAgICByOCwgIzB4MQorICAgICAgICBub3AKKyAgICAgICAgc3RyZXEgICByMiwgW3IxXSAgICAgICAgLyogbG9jayBkcGxsICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDI6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIGxvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMgorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBsZHJlcSAgIHI4LCBbcjNdICAgICAgICAgLyogZ2V0IGxvY2sgY29uZGl0aW9uIGZvciBkcGxsICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQgICAgICAgICAvKiBmaXJzdCB0aW1lIHRob3VnaD8gKi8KKyAgICAgICAgYm5lICAgICAyYgorICAgICAgICBtb3ZlcSAgIHI4LCAjMHgyICAgICAgICAgLyogc2V0IHRvIGRwbGwgY2hlY2sgY29uZGl0aW9uLiAqLworICAgICAgICBiZXEgICAgIDNiICAgICAgICAgICAgICAgLyogaWYgY29uZGl0aW9uIG5vdCB0cnVlIGJyYW5jaCAqLworNDogIAorICAgICAgICBsZHIgICAgIHI0LCBbc3BdCisgICAgICAgIGFkZCAgICAgc3AsIHNwLCAjMHg0ICAgICAvKiByZXR1cm4gc3RhY2sgc3BhY2UgKi8KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworY2ZnM18wX2FkZHI6CisgICAgLndvcmQgIEdQTUNfQ09ORklHM18wCitjZmczXzBfdmFsOiAKKyAgICAud29yZCAgU01OQU5EX0dQTUNfQ09ORklHMworY2ZnNF8wX2FkZHI6CisgICAgLndvcmQgIEdQTUNfQ09ORklHNF8wCitjZmc0XzBfdmFsOgorICAgIC53b3JkICBTTU5BTkRfR1BNQ19DT05GSUc0CitjZmcxXzBfYWRkcjoKKyAgICAud29yZCAgR1BNQ19DT05GSUcxXzAKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX3N0YXQ6CisgICAgLndvcmQgQ01fSURMRVNUX0NLR0VOCitwbGxfZGl2X2FkZDoKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfdmFsOgorICAgIC53b3JkIERQTExfVkFMCS8qIERQTEwgc2V0dGluZyAoMzAwTUh6IGRlZmF1bHQpICovCisjZW5kaWYgICAgICAgICAgICAKKworLmdsb2JsIHBsYXRmb3Jtc2V0dXAKK3BsYXRmb3Jtc2V0dXA6CisJbW92IHIzLCByMCAgICAgLyogc2F2ZSBza2lwIGluZm9ybWF0aW9uICovCisjaWZkZWYgQ09ORklHX0FQVElYCisJbGRyCXIwLAlSRUdfU0RSQ19NQ0ZHXzAKKwlsZHIJcjEsCVZBTF9TRFJDX01DRkdfMAorCXN0cglyMSwJW3IwXQorCWxkcglyMCwJUkVHX1NEUkNfTVJfMAorCWxkcglyMSwJVkFMX1NEUkNfTVJfMAorCXN0cglyMSwJW3IwXQorCS8qIGEgZGRyIG5lZWRzIGVtcjEgc2V0IGhlcmUgKi8KKwlsZHIJcjAsCVJFR19TRFJDX1NIQVJJTkcKKwlsZHIJcjEsCVZBTF9TRFJDX1NIQVJJTkcKKwlzdHIJcjEsCVtyMF0KKyAgICAgICAJbGRyCXIwLAlSRUdfU0RSQ19SRlJfQ1RSTF8wCisJbGRyCXIxLAlWQUxfU0RSQ19SRlJfQ1RSTF8wCisJc3RyCXIxLAlbcjBdCisKKyAgICAgICAvKiBsaXR0bGUgZGVsYXkgYWZ0ZXIgaW5pdCAqLworICAgICAgIG1vdiByMiwgIzB4MTgwMCAgICAgICAgICAgICAgICAgICAgICAgIAorMTogICAgICAgCisgICAgICAgIHN1YnMgcjIsIHIyLCAjMHgxCisgICAgICAgIGJuZSAxYgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BBUlRJQUxfU1JBTQorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIG1vdiAgICAgcjAsICAgICByMyAgICAgIC8qIHBhc3Mgc2tpcCBpbmZvIHRvIHNfaW5pdCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworI2VuZGlmCisKKwkvKiBtYXAgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlsZHIJcjAsCVZBTF9JTlRIX1NFVFVQCisJbWNyCXAxNSwgMCwgcjAsIGMxNSwgYzIsIDQKKworCS8qIGJhY2sgdG8gYXJjaCBjYWxsaW5nIGNvZGUgKi8KKwltb3YJcGMsCWxyCisKKwkvKiB0aGUgbGl0ZXJhbCBwb29scyBvcmlnaW4gKi8KKwkubHRvcmcKKworUkVHX0NPTlRST0xfU1RBVFVTOgorCS53b3JkIENPTlRST0xfU1RBVFVTCitWQUxfSU5USF9TRVRVUDoKKwkud29yZCBQRVJJRkVSQUxfUE9SVF9CQVNFCitTUkFNX1NUQUNLOgorCS53b3JkIExPV19MRVZFTF9TUkFNX1NUQUNLCisKKworCisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQyMGg0L3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NGNhNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDIwaDQveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogSmFudWFyeSAyMDA0IC0gQ2hhbmdlZCB0byBzdXBwb3J0IEg0IGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9hcm0xMTM2L3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Yzk0MWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAyNDMwc2RwLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzUwNzgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9jb25maWcubWsKQEAgLTAsMCArMSwyOCBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBUSSBINCBib2FyZCB3aXRoIE9NQVAyNDIwIChBUk0xMTM2KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cworIworIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgNjRNQiBtRERSLVNEUkFNIG9uIENTMAorIyBINCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwLzAwMDAgKGJhbmsxKSBFUzIgd2lsbCBiZSBjb25maWd1cmFibGUKKyMgTGludXgtS2VybmVsIGlzIGV4cGVjdGVkIHRvIGJlIGF0IDgwMDAnODAwMCwgZW50cnkgODAwMCc4MDAwCisjIChtZW0gYmFzZSArIHJlc2VydmVkKQorCisjIDI0MzAgaDQgaGFzIHNhbWUgbWVtIGNvbmZpZ3VyYXRpb24gYXMgaDQuCisKKyMgRm9yIHVzZSB3aXRoIGV4dGVybmFsIG9yIGludGVybmFsIGJvb3RzLgorIyBDT05GSUdfUEFSVElBTF9TUkFNIG11c3QgYmUgZGVmaW5lZCB0byB1c2UgdGhpcy4KK1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBVc2VkIHdpdGggZnVsbCBTUkFNIGJvb3QuCisjIFRoaXMgaXMgZWl0aGVyIHdpdGggYSBHUCBzeXN0ZW0gb3IgYSBzaWduZWQgYm9vdCBpbWFnZS4KKyMgZWFzaWVzdCwgYW5kIHNhZmVzdCB3YXkgdG8gZ28gaWYgeW91IGNhbi4KKyMgQ29tbWVudCBvdXQgLy9DT05GSUdfUEFSVElBTF9TUkFNIGZvciB0aGlzIG9uZS4KKyMKKyNURVhUX0JBU0UgPSAweDQwMjgwMDAwCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAyNDMwc2RwL29tYXAyNDMwc2RwLmMgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTdiNDIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9vbWFwMjQzMHNkcC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQzMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKHVuc2lnbmVkIGludCB3ZF9iYXNlKTsKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBwZXJpcGhlcmFsX2VuYWJsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIG11eFNldHVwQWxsKHZvaWQpOworc3RhdGljIHUzMiAgZ2V0X2NwdV9yZXYodm9pZCk7CitzdGF0aWMgdTMyICBnZXRfZGV2aWNlX3R5cGUodm9pZCk7CitzdGF0aWMgdm9pZCBwcmNtX2luaXQodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUxLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworICAgICAgICB1MzIgdjsKKyAgICAgICAgdiA9IF9fcmF3X3JlYWRsKFRBUF9JRENPREVfUkVHKTsKKyAgICAgICAgdiA9IHYgPj4gMjg7CisgICAgICAgIHJldHVybih2KzEpOyAgLyogY3VycmVudGx5IDI0MjIgYW5kIDI0MjAgbWF0Y2ggdXAgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSGVscGVyIGZ1bmN0aW9uIHRvIHdhaXQgZm9yIHRoZSBzdGF0dXMgb2YgYSByZWdpc3RlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisgICAgICAgIHUzMiBpID0gMCwgdmFsOworICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgIHZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgICAgICAgICAgaWYgKGk9PWJvdW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICB9IHdoaWxlICgxKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBTdXBwb3J0IGZvciBtdWx0aXBsZSB0eXBlIG9mIG1lbW9yeSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ0ZHX1NEUkFNX0REUgordm9pZAorY29uZmlnX3NkcmFtX2Rkcih1MzIgcmV2KQoreworCS8qIGJhbGwgRDExLCBtb2RlIDAgKi8KKwlfX3Jhd193cml0ZWIoMHgwOCwgMHg0ODAwMDAzMik7CisKKwkvKiBTRFJDX0NTMCBDb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKwlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxBXzBfRVMxLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfQUNUSU1fQ1RSTEJfMF9FUzEsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisKKwkvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKworCS8qIAorCSAqIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIKKwkgKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeQorCSAqIFNlcmlhbCBtb2RlCisJICogQ0FTIGxhdGVuY3kgPSAzIAorCSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCBTRFJDX01SXzApOworCisgCS8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisJLyogRGVsYXkgaXMgOTAgZGVncmVlcyAqLworCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExBX0NUUkwpOwkvLyBFUzIueAorCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCit9CisjZW5kaWYgLy8gQ0ZHX1NEUkFNX0REUgorCisjaWZkZWYgQ0ZHX1NEUkFNX0NPTUJPIAordm9pZAorY29uZmlnX3NkcmFtX2NvbWJvKHUzMiByZXYpCit7CisKKwl1MzIgZGxsY3RybD0wOworCisgICAgICAgIC8qIGJhbGwgQzEyLCBtb2RlIDAgKi8KKyAgICAgICAgX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOworICAgICAgICAvKiBiYWxsIEQxMSwgbW9kZSAwICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsKKyAgICAgICAgLyogYmFsbCBCMTMsIG1vZGUgMCAtIGZvciBDS0UxIChub3QgbmVlZGVkIHJrdyBmb3IgY29tYm8pICovCisgICAgICAgIF9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMGEzKTsKKworICAgICAgICAvKmNvbmZpZ3VyZSBzZHJjIDMyIGJpdCBmb3IgQ09NQk8gZGRyIHNkcmFtLiBJc3N1ZSBzb2Z0IHJlc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDEyLCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgIHdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsgLyogd2FpdCB0aWxsIHJlc2V0IGRvbmUgc2V0ICovCisgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCBTRFJDX1NZU0NPTkZJRyk7CisKKyAgICAgICAgLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisgICAgICAgIC8qIENTME11eENmZzogMDAwICgzMi1iaXQgU0RSQU0gb24gRDMxLi4wKSAqLworCWlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpCisJICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisJZWxzZQorICAgICAgIAkJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisKKyAgICAgICAgLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisgICAgICAgIC8qIEREUi1TRFJBTSwgRXh0ZXJuYWwgU0RSQU0gaXMgeDMyYml0LCAqLworICAgICAgICAvKiBDb25maWd1cmUgdG8gTVVYOTogMXg4TWJ4MzIgICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCQorCS8qIFRoaXMgaXMgcmVxZCBvbmx5IGZvciBFUzEgKi8KKwlpZiAocmV2ID09IENQVV8yNDJYX0VTMSkKKyAgICAgICAgCV9fcmF3X3dyaXRlbChINF8yNDJ4X1NEUkNfUkZSX0NUUkxfRVMxLCBTRFJDX1JGUl9DVFJMKTsKKworICAgICAgICAvKiBNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisgICAgICAgIC8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKyAgICAgICAgLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICAqLworICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMl9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisgICAgICAgIC8qIENTMSBTRFJDIE1lbW9yeSBDb25maWd1cmF0aW9uLCAqLworICAgICAgICAvKiBERFItU0RSQU0sIEV4dGVybmFsIFNEUkFNIGlzIHgzMmJpdCwgKi8KKyAgICAgICAgLyogQ29uZmlndXJlIHRvIE1VWDk6IDF4OE1ieDMyICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX0NPTUJPX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHosIFNEUkNfQUNUSU1fQ1RSTEFfMSk7CisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKwkvKiBUaGlzIGlzIHJlcWQgb25seSBmb3IgRVMxICovCisJaWYgKHJldiA9PSBDUFVfMjQyWF9FUzEpCisgICAgICAgIAlfX3Jhd193cml0ZWwoSDRfMjQyeF9TRFJDX1JGUl9DVFJMX0VTMSwgMHg2ODAwOTBkNCk7CisKKyAgICAgICAgLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKENNRF9OT1AsIDB4NjgwMDkwZDgpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgMHg2ODAwOTBkOCk7CisgICAgICAgIF9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIDB4NjgwMDkwZDgpOworICAgICAgICBfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCAweDY4MDA5MGQ4KTsKKworICAgICAgICAvKiBDUzEgU0RSQyBNb2RlIFJlZ2lzdGVyICovCisJLyogQnVyc3QgbGVuZ3RoID0gNCAtIEREUiBtZW1vcnkgKi8KKyAgICAgICAgLyogU2VyaWFsIG1vZGUgKi8KKyAgICAgICAgLyogQ0FTIGxhdGVuY3kgPSAzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIyX1NEUkNfTVJfMF9ERFIsIDB4NjgwMDkwYjQpOworCisgICAgICAgIC8qIFNEUkMgRExMQSBjb250cm9sIHJlZ2lzdGVyICovCisgICAgICAgIC8qIERlbGF5IGlzIDkwIGRlZ3JlZXMgKi8KKworCWlmIChyZXYgPT0gQ1BVXzI0MlhfRVMxKQorCQlkbGxjdHJsID0gKEJJVDB8QklUMyk7CisJZWxzZQorCQlkbGxjdHJsID0gQklUMDsJCQorCisgICAgICAgIGlmIChyZXYgPT0gQ1BVXzI0MjBfMjQyMl9FUzEpIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoMHgwMDAwNzMwNiwgU0RSQ19ETExBX0NUUkwpOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgweDAwMDA3MzA2LCBTRFJDX0RMTEJfQ1RSTCk7IC8qIGxvYWQgY3RyIHZhbHVlICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsgLyogbG9jayBhbmQgZ28gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsgICAvLyBFUzIueAorICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAvLyBfX3Jhd193cml0ZWwoMHgwMDAwOTgwOCwgU0RSQ19ETExBX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEJfQ1RSTCk7ICAgLy8gRVMyLnggPworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfRExMQUJfQ1RSTCAmIH4oTE9BRERMTHxkbGxjdHJsKSwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgICAgICAgICAgLy9fX3Jhd193cml0ZWwoMHgwMDAwOTgwOCwgU0RSQ19ETExCX0NUUkwpOyAgIC8vIEVTMi54CisgICAgICAgIH0KK30KKworI2VuZGlmIC8vIENGR19TRFJBTV9DT01CTworCisjaWZkZWYgQ0ZHXzI0MzBTRFJBTV9ERFIKK3ZvaWQKK2NvbmZpZ18yNDMwc2RyYW1fZGRyKHUzMiByZXYpCit7CisJdTMyIGRsbHN0YXQsIGRsbGN0cmw7CisKKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMTIsIFNEUkNfU1lTQ09ORklHKTsKKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOyAvKiB3YWl0IHRpbGwgcmVzZXQgZG9uZSBzZXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIFNEUkNfU1lTQ09ORklHKTsKKworCS8qIENoaXAtbGV2ZWwgc2hhcmVkIGludGVyZmFjZSBtYW5hZ2VtZW50ICovCisJLyogU0RSQ1RyaVN0YXRlOiBubyBUcmlzICovCisJLyogQ1MwTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJLyogQ1MxTXV4Q2ZnOiAwMDAgKDMyLWJpdCBTRFJBTSBvbiBEMzEuLjApICovCisJX19yYXdfd3JpdGVsKEg0XzI0MjBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogQ1MwIFNEUkMgTWVtb3J5IENvbmZpZ3VyYXRpb24sICovCisJLyogRERSLVNEUkFNLCBFeHRlcm5hbCBTRFJBTSBpcyB4MzJiaXQsICovCisJLyogQ29uZmlndXJlIHRvIE1VWDE0OiAzMk1ieDMyICovCisJX19yYXdfd3JpdGVsKFNEUF8yNDMwX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKwlfX3Jhd193cml0ZWwoU0RQXzI0MzBfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogTWFudWFsIENvbW1hbmQgc2VxdWVuY2UgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworIAorCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSAyIC0gU0RSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbChINF8yNDIwX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBTZXQgdXAgU0RSQyBETEwgdmFsdWVzIGZvciAyNDMwIEREUiAqLworCWRsbGN0cmwgPSAoU0RQXzI0MzBfU0RSQ19ETExBQl9DVFJMICYgfkJJVDIpOyAvKiBzZXQgdGFyZ2V0IGN0cmwgdmFsICovCisJX19yYXdfd3JpdGVsKGRsbGN0cmwsIFNEUkNfRExMQV9DVFJMKTsJLyogc2V0IGxvY2sgbW9kZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEJfQ1RSTCk7CS8qIHNldCBsb2NrIG1vZGUgKi8KKwlkZWxheSgweDEwMDApOyAvKiB0aW1lIHRvIHRyYWNrIHRvIGNlbnRlciAqLwkKKwlkbGxzdGF0ID0gX19yYXdfcmVhZGwoU0RSQ19ETExBX1NUQVRVUykgJiAweEZGMDA7IC8qIGdldCBzdGF0dXMgKi8KKwlkbGxjdHJsID0gKGRsbGN0cmwgJiAweDAwRkYpIHwgZGxsc3RhdCB8IEJJVDI7IC8qIGJ1aWxkIHVubG9jayB2YWx1ZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEFfQ1RSTCk7CS8qIHNldCB1bmxvY2sgbW9kZSAqLworCV9fcmF3X3dyaXRlbChkbGxjdHJsLCBTRFJDX0RMTEJfQ1RSTCk7CS8qIHNldCB1bmxvY2sgbW9kZSAqLworfQorI2VuZGlmIC8vIENGR18yNDMwU0RSQU1fRERSCisKKyNpZmRlZiBDRkdfU0RSQU1fU1RBQ0tFRCAKK3ZvaWQKK2NvbmZpZ19zZHJhbV9zdGFja2VkKHUzMiByZXYpCit7CisKKwkvKiBQaW4gTXV4aW5nIGZvciBTRFJDICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTEpOwkvKiBtdXggbW9kZSAwIChDUzEpICovCisJX19yYXdfd3JpdGViKDB4MDAsIDB4NDgwMDAwYTMpOwkvKiBtdXggbW9kZSAwIChDS0UxKSAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMyKTsJLyogY29ubmVjdCBzZHJjX2ExMiAqLworCV9fcmF3X3dyaXRlYigweDAwLCAweDQ4MDAwMDMxKTsJLyogY29ubmVjdCBzZHJjX2ExMyAqLworCisJLyogY29uZmlndXJlIHNkcmMgMzIgYml0IGZvciBDT01CTyBkZHIgc2RyYW0gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBubyBpZGxlIGFjayBhbmQgUkVTRVQgZW5hYmxlICovCisJZGVsYXkoMjAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAxMCwgU0RSQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlIG1vZGUgKi8KKworCS8qIFNEUkNfU0hBUklORyAqLworCS8qIFUtYm9vdCBpcyB3cml0aW5nIDB4MDAwMDAxMDAgdGhvdWdoIChINF8yNDIwX1NEUkNfU0hBUklORyApICovCisJLy9fX3Jhd193cml0ZWwoSDRfMjQyMF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwlfX3Jhd193cml0ZWwoMHgwMDAwNDkwMCwgU0RSQ19TSEFSSU5HKTsKKworCS8qIFNEUkNfQ1MwIENvbmZpZ3VyYXRpb24gKi8KKwkvKiBOb25lIGZvciBFUzIuMSAqLworCisJLyogIFNEUkNfQ1MxIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgU0RSQ19DU19DRkcpOwkvKiBSZW1hcCBDUzEgdG8gMHg4MDAwMDAwMCAqLworCisJLyogRGlzYWJsZSBwb3dlciBkb3duIG9mIENLRSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDg1LCBTRFJDX1BPV0VSKTsKKworCV9fcmF3X3dyaXRlbCgweDAxQTAyMDE5LCBTRFJDX01DRkdfMSk7CS8qIFNEUkNfTUNGRzEgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAzREQwMywgU0RSQ19SRlJfQ1RSTDEpOwkvKiBTRFJDX1JGUl9DVFJMMSAqLworCV9fcmF3X3dyaXRlbCgweDkyRERDNDg1LCBTRFJDX0FDVElNX0NUUkxBXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxBMCAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDE0LCBTRFJDX0FDVElNX0NUUkxCXzEpOwkvKiBTRFJDX0FDVElNX0NUUkxCMCAqLworCisJLypNYW51YWwgQ29tbWFuZCBzZXF1ZW5jZSAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAwLCAweDY4MDA5MEQ4KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgMHg2ODAwOTBEOCk7CisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDIsIDB4NjgwMDkwRDgpOworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDAyLCAweDY4MDA5MEQ4KTsKKworCS8qIENTMCBTRFJDIE1vZGUgUmVnaXN0ZXIgKi8KKwkvKiBCdXJzdCBsZW5ndGggPSA0IC0gRERSIG1lbW9yeSAqLworCS8qIFNlcmlhbCBtb2RlICovCisJLyogQ0FTIGxhdGVuY3kgPSAzICAqLworCV9fcmF3X3dyaXRlbCgweDAwMDAwMDMyLCAweDY4MDA5MEI0KTsKKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAyMCwgMHg2ODAwOTBCQyk7CS8qIHdlYWstc3RyZW5ndGggZHJpdmVyICovCisKKyAJLyogU0RSQyBETExBIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKwkvKiBEZWxheSBpcyA5MCBkZWdyZWVzICovCisJaWYgKHJldiA9PSBDUFVfMjQyMF8yNDIyX0VTMSkgeworCQkvKiBFbmFibGUgRExMLCBMb2FkIGNvdW50ZXIgd2l0aCAxMTUgKG1pZGRsZSBvZiByYW5nZSkgKi8gCisJCV9fcmF3X3dyaXRlbCgweDAwMDA3MzAyLCBTRFJDX0RMTEFfQ1RSTCk7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDEyOCAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDczMDIsIFNEUkNfRExMQl9DVFJMKTsKKwl9CisJZWxzZSB7CisJCS8qIEVuYWJsZSBETEwsIExvYWQgY291bnRlciB3aXRoIDExNSAobWlkZGxlIG9mIHJhbmdlKSAqLyAKKwkJX19yYXdfd3JpdGVsKDB4MDAwMDMxMDgsIFNEUkNfRExMQV9DVFJMKTsJLy8gRVMyLngKKwkJLyogRW5hYmxlIERMTCwgTG9hZCBjb3VudGVyIHdpdGggMTI4IChtaWRkbGUgb2YgcmFuZ2UpICovIAorCQlfX3Jhd193cml0ZWwoMHgwMDAwMzEwOCwgU0RSQ19ETExCX0NUUkwpOwkvLyBFUzIueAorCX0KK30KKyNlbmRpZiAvLyBDRkdfU0RSQU1fU1RBQ0tFRAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHUzMiAqc2hpZnQpCit7CisjZGVmaW5lIEdQVF9FTiAgKCgwPDwyKXxCSVQxfEJJVDApICAgICAgLyogZW5hYmxlIHN5c19jbGsgTk8tcHJlc2NhbGUgLzEgKi8KKyNkZWZpbmUgR1BUX0NUUiBPTUFQMjRYWF9HUFQyK1RDUlIgICAgICAvKiByZWFkIGNvdW50ZXIgYWRkcmVzcyAqLworICAgICAgICB1MzIgc3RhcnQsIGNzdGFydCwgY2VuZCwgY2RpZmYsIHZhbDsKKwl1bnNpZ25lZCBpbnQgdiwgaWZfY2xrcz0wLCBmdW5jX2Nsa3M9MCA7CisKKworCisgICAgICAgIGlmKF9fcmF3X3JlYWRsKFBSQ01fQ0xLU1JDX0NUUkwpICYgQklUNyl7ICAgIC8qIGlmIGN1cnJlbnRseSAvMiAqLworICAgICAgICAgICAgICAgICpzaGlmdCA9IDE7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgICpzaGlmdCA9IDA7CisgICAgICAgIH0KKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OyAgICAgIC8qIG1hc2sgZm9yIHN5c19jbGsgdXNlICovCisJX19yYXdfd3JpdGVsKHZhbCwgQ01fQ0xLU0VMMl9DT1JFKTsgICAgICAgICAgICAvKiB0aW1lcjIgc291cmNlIHRvIHN5c19jbGsgKi8KKwlfX3Jhd193cml0ZWwoQklUNCwgQ01fSUNMS0VOMV9DT1JFKTsgICAgICAgICAgIC8qIHRpbWVyMiBpbnRlcmZhY2UgY2xvY2sgb24gKi8KKwlfX3Jhd193cml0ZWwoQklUNCwgQ01fRkNMS0VOMV9DT1JFKTsgICAgICAgICAgIC8qIHRpbWVyMiBmdW5jdGlvbiBjbG9jayBvbiAqLworCS8qIEVuYWJsZSBHUDIgdGltZXIuKi8KKwlpZl9jbGtzIHw9IEJJVDQ7CisJZnVuY19jbGtzIHw9IEJJVDQ7CisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0ZDTEtFTjFfQ09SRSkgfCBmdW5jX2Nsa3M7IC8qIEZ1bmN0aW9uYWwgQ2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsIENNX0ZDTEtFTjFfQ09SRSk7CisgICAgICAgIF9fcmF3X3dyaXRlbCgwLCBPTUFQMjRYWF9HUFQyK1RMRFIpOyAgICAgICAgICAgLyogc3RhcnQgY291bnRpbmcgYXQgMCAqLworICAgICAgICBfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMjRYWF9HUFQyK1RDTFIpOyAgICAgIC8qIGVuYWJsZSBjbG9jayAqLworICAgICAgICAvKiBlbmFibGUgMzJrSHogc291cmNlICovICAgICAgICAgICAgICAgICAgICAgIC8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisgICAgICAgIC8qIGRldGVybWluZSBzeXNfY2xrIHZpYSBnYXVnaW5nICovCisgICAgICAgIHN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsgICAgICAgICAgICAgLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMqLworICAgICAgICB3aGlsZShfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsgICAgICAgICAgIC8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKyAgICAgICAgY3N0YXJ0ID0gX19yYXdfcmVhZGwoR1BUX0NUUik7ICAgICAgICAgICAgICAgICAvKiBnZXQgc3RhcnQgc3lzX2NsayBjb3VudCAqLworICAgICAgICB3aGlsZShfX3Jhd19yZWFkbChTMzJLX0NSKSA8IChzdGFydCsyMCkpOyAgICAgIC8qIHdhaXQgZm9yIDQwIGN5Y2xlcyAqLworICAgICAgICBjZW5kID0gX19yYXdfcmVhZGwoR1BUX0NUUik7ICAgICAgICAgICAgICAgICAgIC8qIGdldCBlbmQgc3lzX2NsayBjb3VudCAqLworICAgICAgICBjZGlmZiA9IGNlbmQgLSBjc3RhcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBlbGFwc2VkIHRpY2tzICovCisgICAgICAgIC8qIGJhc2VkIG9uIG51bWJlciBvZiB0aWNrcyBhc3NpZ24gc3BlZWQgKi8KKyAgICAgICAgaWYoY2RpZmYgPiAoMTkwMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzM4XzRNKTsKKyAgICAgICAgZWxzZSBpZiAoY2RpZmYgPiAoMTUyMDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzI2TSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDEzMDAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMyNE0pOworICAgICAgICBlbHNlIGlmIChjZGlmZiA+ICg5MDAwID4+ICpzaGlmdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuKFMxOV8yTSk7CisgICAgICAgIGVsc2UgaWYgKGNkaWZmID4gKDc2MDAgPj4gKnNoaWZ0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4oUzEzTSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4oUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHByY21faW5pdCgpIC0gaW5pdHMgY2xvY2tzIGZvciBQUkNNIGFzIGRlZmluZWQgaW4gY2xvY2tzLmggKGNvbmZpZyBJSSBkZWZhdWx0KS4KKyAqICAgLS0gY2FsbGVkIGZyb20gU1JBTQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK3ByY21faW5pdCgpCit7CisJdTMyIGRpdiwgc3BlZWQsIHZhbCwgZGl2X2J5XzI7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUkNNX0NMS1NSQ19DVFJMKSAmIH4oQklUMSB8IEJJVDApOworI2lmIGRlZmluZWQoT01BUDI0MzBfU1FVQVJFX0NMT0NLX0lOUFVUKQorCV9fcmF3X3dyaXRlbCh2YWwsIFBSQ01fQ0xLU1JDX0NUUkwpOworI2Vsc2UKKwlfX3Jhd193cml0ZWwoKHZhbCB8IEJJVDApLCBQUkNNX0NMS1NSQ19DVFJMKTsKKyNlbmRpZgorCXNwZWVkID0gZ2V0X29zY19jbGtfc3BlZWQoJmRpdl9ieV8yKTsKKyAgICAgICAgaWYoKHNwZWVkID4gUzE5XzJNKSAmJiAoIWRpdl9ieV8yKSl7IC8qIGlmIGZhc3QgJiYgLzIgb2ZmLCBlbmFibGUgaXQgKi8KKyAgICAgICAgICAgICAgICB2YWwgPSB+KEJJVDZ8QklUNykgJiBfX3Jhd19yZWFkbChQUkNNX0NMS1NSQ19DVFJMKTsKKyAgICAgICAgICAgICAgICB2YWwgfD0gKDB4MiA8PCA2KTsgLyogZGl2aWRlIGJ5IDIgaWYgKDI0LDI2LDM4LjQpIC0+ICgxMi8xMy8xOS4yKSAgKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZWwodmFsLCBQUkNNX0NMS1NSQ19DVFJMKTsKKyAgICAgICAgfQorCisJX19yYXdfd3JpdGVsKDAsIENNX0ZDTEtFTjFfQ09SRSk7CS8qIHN0b3AgYWxsIGNsb2NrcyB0byByZWR1Y2UgcmluZ2luZyAqLworCV9fcmF3X3dyaXRlbCgwLCBDTV9GQ0xLRU4yX0NPUkUpOwkvKiBtYXkgbm90IGJlIG5lY2Vzc2FyeSAqLworCV9fcmF3X3dyaXRlbCgwLCBDTV9JQ0xLRU4xX0NPUkUpOworCV9fcmF3X3dyaXRlbCgwLCBDTV9JQ0xLRU4yX0NPUkUpOworCisJLypEUExMIGludG8gbG93IHBvd2VyIGJ5cGFzcyAob3RoZXJzIG9mZikgKi8KKwlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMSwgQ01fQ0xLRU5fUExMKTsKKworCV9fcmF3X3dyaXRlbChEUExMX09VVCwgQ01fQ0xLU0VMMl9QTEwpOyAvKiBzZXQgRFBMTCBvdXQgKi8KKyAgICAgICAgX19yYXdfd3JpdGVsKE1QVV9ESVYsIENNX0NMS1NFTF9NUFUpOyAgIC8qIHNldCBNUFUgZGl2aWRlciAqLworICAgICAgICBfX3Jhd193cml0ZWwoRFNQX0RJViwgQ01fQ0xLU0VMX0RTUCk7ICAgLyogc2V0IGRzcCBhbmQgaXZhIGRpdmlkZXJzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChHRlhfRElWLCBDTV9DTEtTRUxfR0ZYKTsgICAvKiBzZXQgZ2Z4IGRpdmlkZXJzICovCisgICAgICAgIF9fcmF3X3dyaXRlbChNRE1fRElWLCBDTV9DTEtTRUxfTURNKTsgICAvKiBzZXQgbWRtIGRpdmlkZXJzICovCisKKwlkaXYgPSBCVVNfRElWOworCV9fcmF3X3dyaXRlbChkaXYsIENNX0NMS1NFTDFfQ09SRSk7Lyogc2V0IEwzL0w0L1VTQi9EaXNwbGF5L1NTaSBkaXZpZGVycyAqLworCWRlbGF5KDEwMDApOworCisJLyoxM01IeiBhcGxsIHNyYywgUFJDTSAneCcgRFBMTCByYXRlICovCisJX19yYXdfd3JpdGVsKERQTExfVkFMLCBDTV9DTEtTRUwxX1BMTCk7CisKKwkvKlZhbGlkIHRoZSBjb25maWd1cmF0aW9uICovCisJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDEsIFBSQ01fQ0xLQ0ZHX0NUUkwpOworCWRlbGF5KDEwMDApOworCisJLyogc2V0IHVwIEFQTExTX0NMS0lOIHBlciBjcnlzdGFsICovCisJaWYgKHNwZWVkID4gUzE5XzJNKQorICAgICAgICAgICAgICAgIHNwZWVkID4+PSAxOyAgICAvKiBpZiBmYXN0IHNoaWZ0IHRvIC8yIHJhbmdlICovCisgICAgICAgIHZhbCA9ICgweDIgPDwgMjMpOyAgICAgIC8qIGRlZmF1bHQgdG8gMTNNaHogZm9yIDI0MzBjICovCisgICAgICAgIGlmIChzcGVlZCA9PSBTMTJNKQorICAgICAgICAgICAgICAgIHZhbCA9ICgweDMgPDwgMjMpOworICAgICAgICBlbHNlIGlmIChzcGVlZCA9PSBTMTlfMk0pCisgICAgICAgICAgICAgICAgdmFsID0gKDB4MCA8PCAyMyk7CisgICAgICAgIHZhbCB8PSAofihCSVQyM3xCSVQyNHxCSVQyNSkgJiBfX3Jhd19yZWFkbChDTV9DTEtTRUwxX1BMTCkpOworICAgICAgICBfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUwxX1BMTCk7CisKKyAgICAgICAgX19yYXdfd3JpdGVsKERQTExfTE9DS3xBUExMX0xPQ0ssIENNX0NMS0VOX1BMTCk7ICAgLyogZW5hYmxlIGFwbGwgKi8KKyAgICAgICAgd2FpdF9vbl92YWx1ZShCSVQ4LCBCSVQ4LCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7Lyogd2FpdCBmb3IgYXBsbCBsb2NrICovCisKKyAgICAgICAgZGVsYXkoMjAwMDAwKTsKK30KKwordm9pZCBTRUNfZ2VuZXJpYyh2b2lkKQoreworLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKyNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzEgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTApOyAgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NTgpOyAgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDYwKTsgLyogQUREUl9NQVRDSF8xIEwqLworCisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9PQ01fUkFNX0JBU0VfQUREUl9BUk0gKyAweDQ4KTsgLyogUkVRX0lORk9fUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1MCk7IC8qIFJFQURfUEVSTUlTU0lPTl8wIEwqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1OCk7IC8qIFdSSVRFX1BFUk1JU1NJT05fMCBMKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4ODApOyAgLyogQUREUl9NQVRDSF8yIEwqLworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NDgpOyAvKiBSRVFfSU5GT19QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDUwKTsgLyogUkVBRF9QRVJNSVNTSU9OXzAgTCovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDU4KTsgLyogV1JJVEVfUEVSTUlTU0lPTl8wIEwqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfc3JhbSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKworICAgICAgICAvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworICAgICAgICBtb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisKKyAgICAgICAgaWYgKChtb2RlID09IEdQX0RFVklDRSkgfHwgKG1vZGUgPT0gSFNfREVWSUNFKSB8fCAobW9kZSA9PSBFTVVfREVWSUNFKQorICAgICAgICAgICAgfHwgKG1vZGUgPT0gVFNUX0RFVklDRSkpIHsKKyAgICAgICAgICAgICAgICAvKiBTZWN1cmUgb3IgRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCAqLworICAgICAgICAgICAgICAgIFNFQ19nZW5lcmljKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgc19pbml0KGludCBza2lwKQoreworICAgICAgICB1MzIgICByZXY7CisKKyAgICAgICAgcmV2ID0gZ2V0X2NwdV9yZXYoKTsKKworICAgICAgICB3YXRjaGRvZ19pbml0KCk7CisJdHJ5X3VubG9ja19zcmFtKCk7ICAgCisgICAgICAgIG11eFNldHVwQWxsKCk7CisgICAgICAgIGRlbGF5KDEwMCk7CisJcHJjbV9pbml0KCk7CisKKyNpZmRlZiBDRkdfU0RSQU1fRERSCisgICAgICAgIGNvbmZpZ19zZHJhbV9kZHIocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHX1NEUkFNX0NPTUJPKQorICAgICAgICBjb25maWdfc2RyYW1fY29tYm8ocmV2KTsKKyNlbGlmIGRlZmluZWQoQ0ZHXzI0MzBTRFJBTV9ERFIpCisgICAgICAgIGNvbmZpZ18yNDMwc2RyYW1fZGRyKHJldik7CisjZWxpZiBkZWZpbmVkKENGR19TRFJBTV9TVEFDS0VEKQorICAgICAgICBjb25maWdfc2RyYW1fc3RhY2tlZChyZXYpOworI2Vsc2UKKyNlcnJvciBTRFJBTSB0eXBlIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorCisgICAgICAgIGRlbGF5KDIwMDAwKTsKKyAgICAgICAgcGVyaXBoZXJhbF9lbmFibGUoKTsKKyAgICAgICAgcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbWlzY19pbml0X3IKKyAqIERlc2NyaXB0aW9uOiBJbml0IGV0aGVybmV0IChkb25lIGhlcmUgc28gdWRlbGF5IHdvcmtzKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IG1pc2NfaW5pdF9yICh2b2lkKQoreworCXJldHVybigwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworI2RlZmluZSBHUCAoQklUOHxCSVQ5KQorCisJLyogVGhlcmUgYXJlIDQgd2F0Y2ggZG9ncy4gIDEgc2VjdXJlLCBhbmQgMyBnZW5lcmFsIHB1cnBvc2UuCisJICogSSB3b3VsZCBleHBlY3QgdGhhdCB0aGUgUk9NIHRha2VzIGNhcmUgb2YgdGhlIHNlY3VyZSBvbmUsCisJICogYnV0IHdlIHdpbGwgdHJ5IGFsc28uICBPZiB0aGUgMyBHUCBvbmVzLCAxIGNhbiByZXNldCB1cworCSAqIGRpcmVjdGx5LCB0aGUgb3RoZXIgMiBvbmx5IGdlbmVyYXRlIE1QVSBpbnRlcnJ1cHRzLgorCSAqLworCV9fcmF3X3dyaXRlbChXRF9VTkxPQ0sxICxXRDJfQkFTRStXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiAsV0QyX0JBU0UrV1NQUik7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZQorICogRGVzY3JpcHRpb246IFdhaXQgZm9yIHBvc3RpbmcgdG8gZmluaXNoIG9uIHdhdGNoZG9nCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZStXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZHJhbV9pbml0CisgKiBEZXNjcmlwdGlvbjogc2V0cyB1Ym9vdHMgaWRlYSBvZiBzZHJhbSBzaXplCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkcmFtX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHBlcmlwaGVyYWxfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHYsIGlmX2Nsa3M9MCwgaWZfY2xrczIgPSAwLCBmdW5jX2Nsa3M9MCwgZnVuY19jbGtzMiA9IDA7CisKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiovCisJaWZfY2xrcyB8PSBCSVQ0OworCWZ1bmNfY2xrcyB8PSBCSVQ0OworCXYgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUwyX0NPUkUpIHwgMHg0OwkvKiBTeXNfY2xrIGlucHV0IE9NQVAyNFhYX0dQVDIgKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fQ0xLU0VMMl9DT1JFKTsKKwlfX3Jhd193cml0ZWwoMHgxLCBDTV9DTEtTRUxfV0tVUCk7CisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9jayAqLworCWZ1bmNfY2xrcyB8PSBCSVQyMTsKKwlpZl9jbGtzIHw9IEJJVDIxOworI2VuZGlmCisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjFfQ09SRSkgfCBpZl9jbGtzOwkvKiBJbnRlcmZhY2UgY2xvY2tzIG9uICovCisJX19yYXdfd3JpdGVsKHYsQ01fSUNMS0VOMV9DT1JFICk7CisJdiA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTjJfQ09SRSkgfCBpZl9jbGtzMjsgICAgLyogSW50ZXJmYWNlIGNsb2NrcyBvbiAqLworICAgICAgICBfX3Jhd193cml0ZWwodiwgQ01fSUNMS0VOMl9DT1JFKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMV9DT1JFKSB8IGZ1bmNfY2xrczsgLyogRnVuY3Rpb25hbCBDbG9ja3Mgb24gKi8KKwlfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMV9DT1JFKTsKKwl2ID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOMl9DT1JFKSB8IGZ1bmNfY2xrczI7ICAvKiBGdW5jdGlvbmFsIENsb2NrcyBvbiAqLworICAgICAgICBfX3Jhd193cml0ZWwodiwgQ01fRkNMS0VOMl9DT1JFKTsKKwlkZWxheSgxMDAwKTsKKworfQorCisvKiBEbyBwaW4gbXV4aW5nIGZvciBhbGwgdGhlIGRldmljZXMgdXNlZCBpbiBYLUxvYWRlciAqLworI2RlZmluZSBNVVhfVkFMKE9GRlNFVCxWQUxVRSlcCisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGViKFZBTFVFLCBPTUFQMjRYWF9DVFJMX0JBU0UgKyBPRkZTRVQpOworc3RhdGljIHZvaWQgbXV4U2V0dXBBbGwodm9pZCkKK3sKKwkvKiBVQVJUIDEqLworCU1VWF9WQUwoMHgwMEIxLCAweDFCKSAgICAgICAgLyogdWFydDFfY3RzLSBFTiwgSEksIDMsIC0+Z3Bpb18zMiAqLworCU1VWF9WQUwoMHgwMEIyLCAweDFCKSAgICAgICAgLyogdWFydDFfcnRzLSBFTiwgSEksIDMsIC0+Z3Bpb184ICovCisJTVVYX1ZBTCgweDAwQjMsIDB4MUIpICAgICAgICAvKiB1YXJ0MV90eC0gRU4sIEhJLCAzLCAtPmdwaW9fOSAqLworCU1VWF9WQUwoMHgwMEI0LCAweDFCKSAgICAgICAgLyogdWFydDFfcngtIEVOLCBISSwgMywgLT5ncGlvXzEwICovCisJTVVYX1ZBTCgweDAxMDcsIDB4MDEpICAgICAgICAvKiBzc2kxX2RhdF90eC0gRGlzLCAxLCAtPnVhcnQxX3R4ICovCisJTVVYX1ZBTCgweDAxMDgsIDB4MDEpICAgICAgICAvKiBzc2kxX2ZsYWdfdHgtIERpcywgMSwgLT51YXJ0MV9ydHMgKi8KKwlNVVhfVkFMKDB4MDEwOSwgMHgwMSkgICAgICAgIC8qIHNzaTFfcmR5X3R4LSBEaXMsIDEsIC0+dWFydDFfY3RzICovCisJTVVYX1ZBTCgweDAxMEEsIDB4MDEpICAgICAgICAvKiBzc2kxX2RhdF9yeC0gRGlzLCAxLCAtPnVhcnQxX3J4ICovCisKKwkvKiBNdXggc2V0dGluZ3MgZm9yIFNEUkMgKi8KKwlNVVhfVkFMKDB4MDA1NCwgMHgxQikgICAgICAgIC8qIHNkcmNfYTE0IC0gRU4sIEhJLCAzLCAtPmdwaW9fMCAqLworCU1VWF9WQUwoMHgwMDU1LCAweDFCKSAgICAgICAgLyogc2RyY19hMTMgLSBFTiwgSEksIDMsIC0+Z3Bpb18xICovCisJTVVYX1ZBTCgweDAwNTYsIDB4MDApICAgICAgICAvKiBzZHJjX2ExMiAtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQ2LCAweDAwKSAgICAgICAgLyogc2RyY19uY3MxIC0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDgsIDB4MDApICAgICAgICAvKiBzZHJjX2NrZTEgLSBEaXMsIDAgKi8KKwkvKiBHUE1DICovCisJTVVYX1ZBTCgweDAwMzAsIDB4MDApICAgICAgICAvKiBncG1jX2NsayAtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDMyLCAweDAwKSAgICAgICAgLyogZ3BtY19uY3MxLSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDAzMywgMHgwMCkgICAgICAgIC8qIGdwbWNfbmNzMi0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwMzQsIDB4MDMpICAgICAgICAvKiBncG1jX25jczMtIERpcywgMywgLT5ncGlvXzI0ICovCisJTVVYX1ZBTCgweDAwMzUsIDB4MDMpICAgICAgICAvKiBncG1jX25jczQtIERpcywgMywgLT5ncGlvXzI1ICovCisJTVVYX1ZBTCgweDAwMzYsIDB4MDApICAgICAgICAvKiBncG1jX25jczUtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDM3LCAweDAzKSAgICAgICAgLyogZ3BtY19uY3M2LSBEaXMsIDMsIC0+Z3Bpb18yNyAqLworCU1VWF9WQUwoMHgwMDM4LCAweDAwKSAgICAgICAgLyogZ3BtY19uY3M3LSBEaXMsIDAgKi8KKwlNVVhfVkFMKDB4MDA0MCwgMHgxOCkgICAgICAgIC8qIGdwbWNfd2FpdDEtIERpcywgMCAqLworCU1VWF9WQUwoMHgwMDQxLCAweDE4KSAgICAgICAgLyogZ3BtY193YWl0Mi0gRGlzLCAwICovCisJTVVYX1ZBTCgweDAwNDIsIDB4MUIpICAgICAgICAvKiBncG1jX3dhaXQzLSBFTiwgSEksIDMsIC0+Z3Bpb18zNSAqLworCU1VWF9WQUwoMHgwMDg1LCAweDFCKSAgICAgICAgLyogZ3BtY19hMTAtIEVOLCBISSwgMywgLT5ncGlvXzMgKi8KK30KKworaW50IG5hbmRfaW5pdCh2b2lkKQoreworCXUzMglyZXY7CisKKwkvKiBHUE1DIENvbmZpZ3VyYXRpb24gKi8KKwlyZXYgID0gZ2V0X2NwdV9yZXYoKTsKKworCS8qIGdsb2JhbCBzZXR0aW5ncyAqLworCV9fcmF3X3dyaXRlbCgweDEwLCBHUE1DX1NZU0NPTkZJRyk7CS8qIHNtYXJ0IGlkbGUgKi8KKwlfX3Jhd193cml0ZWwoMHgwLCBHUE1DX0lSUUVOQUJMRSk7CS8qIGlzcidzIHNvdXJjZXMgbWFza2VkICovCisJX19yYXdfd3JpdGVsKDAsIEdQTUNfVElNRU9VVF9DT05UUk9MKTsvKiB0aW1lb3V0IGRpc2FibGUgKi8KKyNpZmRlZiBDRkdfTkFORAorCV9fcmF3X3dyaXRlbCgweDAwMSwgR1BNQ19DT05GSUcpOwkvKiBzZXQgbldQLCBkaXNhYmxlIGxpbWl0ZWQgYWRkciAqLworI2VuZGlmCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMjQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1M1LiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzIAorCSAqICBhdCBvdGhlciBDUyBpbiBkb25lIGluIHUtYm9vdCBhbnl3YXkuIFNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIGRvaW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX0NPTkZJRzdfMCk7CisJc2RlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMV8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMl8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNF8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNV8wKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNl8wKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzFfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyXzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHM18wKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzRfMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1XzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNl8wKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMjRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgR1BNQ19DT05GSUc3XzApOworCXNkZWxheSgyMDAwKTsKKyNpZmRlZiBDRkdfTkFORAorIAlpZiAobmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2Vsc2UKKwlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKwkJcHJpbnRmKCJPbmVOQU5EIFVuc3VwcG9ydGVkICFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC9wbGF0Zm9ybS5TIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIxZDdlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMjQzMC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogIGdvX3RvX3NwZWVkOiAtTW92ZXMgdG8gYnlwYXNzLCAtQ29tbWl0cyBjbG9jayBkaXZpZGVycywgLXB1dHMgZHBsbCBhdCBzcGVlZAorICogICAgICAgICAgICAgICAtZXhlY3V0ZWQgZnJvbSBTUkFNLgorICogIFIwID0gUFJDTV9DTEtDRkdfQ1RSTCAtIGFkZHIgb2YgdmFsaWQgcmVnCisgKiAgUjEgPSBDTV9DTEtFTl9QTEwgLSBhZGRyIGRwbGwgY3RsciByZWcKKyAqICBSMiA9IGRwbGwgdmFsdWUKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAorLmdsb2JhbCBnb190b19zcGVlZAorIGdvX3RvX3NwZWVkOgorICAgICAgICBzdWIgICAgIHNwLCBzcCwgIzB4NCAvKiBnZXQgc29tZSBzdGFjayBzcGFjZSAqLworICAgICAgICBzdHIgICAgIHI0LCBbc3BdICAgICAvKiBzYXZlIHI0J3MgdmFsdWUgKi8KKworICAgICAgICAvKiBtb3ZlIGludG8gZmFzdCByZWxvY2sgYnlwYXNzICovCisgICAgICAgIGxkciAgICAgcjgsIHBsbF9jdGxfYWRkCisgICAgICAgIG1vdiAgICAgcjQsICMweDIKKyAgICAgICAgc3RyICAgICByNCwgW3I4XQorICAgICAgICBsZHIgICAgIHI0LCBwbGxfc3RhdAorYmxvY2s6CisgICAgICAgIGxkciAgICAgcjgsIFtyNF0JLyogd2FpdCBmb3IgYnlwYXNzIHRvIHRha2UgZWZmZWN0ICovCisgICAgICAgIGFuZCAgICAgcjgsIHI4LCAjMHgzCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgYm5lICAgICBibG9jaworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNCwgcGxsX2Rpdl9hZGQKKwlsZHIgICAgIHI4LCBwbGxfZGl2X3ZhbAorICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisgICAgCisgICAgICAgIC8qIG5vdyBwcmVwYXJlIEdQTUMgKGZsYXNoKSBmb3IgbmV3IGRwbGwgc3BlZWQgKi8KKwkvKiBmbGFzaCBuZWVkcyB0byBiZSBzdGFibGUgd2hlbiB3ZSBqdW1wIGJhY2sgdG8gaXQgKi8KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnM19hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGZsYXNoX2NmZzNfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnNF9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIGZsYXNoX2NmZzRfdmFsCisgICAgICAgIHN0ciAgICAgcjgsIFtyNF0KKyAgICAgICAgbGRyICAgICByNCwgZmxhc2hfY2ZnMV9hZGRyCisgICAgICAgIGxkciAgICAgcjgsIFtyNF0KKyAgICAgICAgb3JyICAgICByOCwgcjgsICMweDMgICAgIC8qIHVwIGdwbWMgZGl2aWRlciAqLworICAgICAgICBzdHIgICAgIHI4LCBbcjRdCisKKwkvKiBzZXR1cCB0byAyeCBsb29wIHRob3VnaCBjb2RlLiAgVGhlIGZpcnN0IGxvb3AgcHJlLWxvYWRzIHRoZSAKKyAgICAgICAgICogaWNhY2hlLCB0aGUgMm5kIGNvbW1pdHMgdGhlIHByY20gY29uZmlnLCBhbmQgbG9ja3MgdGhlIGRwbGwKKyAgICAgICAgICovCisgICAgICAgIG1vdiAgICAgcjQsICMweDEwMDAgICAgICAvKiBzcGluIHNwaW4gc3BpbiAqLworICAgICAgICBtb3YgICAgIHI4LCAjMHg0ICAgICAgICAgLyogZmlyc3QgcGFzcyBjb25kaXRpb24gJiBzZXQgcmVnaXN0ZXJzICovCisgICAgICAgIGNtcCAgICAgcjgsICMweDQKKzI6CisgICAgICAgIGxkcm5lICAgcjgsIFtyM10gICAgICAgICAvKiBEUExMIGxvY2sgY2hlY2sgKi8KKyAgICAgICAgYW5kICAgICByOCwgcjgsICMweDcKKyAgICAgICAgY21wICAgICByOCwgIzB4MgorICAgICAgICBiZXEgICAgIDRmCiszOgorICAgICAgICBzdWJlcSAgIHI4LCByOCwgIzB4MQorICAgICAgICBzdHJlcSAgIHI4LCBbcjBdICAgICAgICAgLyogY29tbWl0IGRpdmlkZXJzICgybmQgdGltZSkgKi8KKyAgICAgICAgbm9wCitsbG9vcDE6CisgICAgICAgIHN1YiAgICAgcjQsIHI0LCAjMHgxICAgIC8qIExvb3AgY3VycmVudGx5IG5lY2Vzc2FyeSBlbHNlIGJhZCBqdW1wcyAqLworICAgICAgICBub3AKKyAgICAgICAgY21wICAgICByNCwgIzB4MAorICAgICAgICBibmUgICAgIGxsb29wMQorICAgICAgICBtb3YgICAgIHI0LCAjMHg0MDAwMAorICAgICAgICBjbXAgICAgIHI4LCAjMHgxCisgICAgICAgIG5vcAorICAgICAgICBzdHJlcSAgIHIyLCBbcjFdICAgICAgICAvKiBsb2NrIGRwbGwgKDJuZCB0aW1lKSAqLworICAgICAgICBub3AKK2xsb29wMjoKKyAgICAgICAgc3ViICAgICByNCwgcjQsICMweDEgICAgLyogbG9vcCBjdXJyZW50bHkgbmVjZXNzYXJ5IGVsc2UgYmFkIGp1bXBzICovCisgICAgICAgIG5vcAorICAgICAgICBjbXAgICAgIHI0LCAjMHgwCisgICAgICAgIGJuZSAgICAgbGxvb3AyCisgICAgICAgIG1vdiAgICAgcjQsICMweDQwMDAwCisgICAgICAgIGNtcCAgICAgcjgsICMweDEKKyAgICAgICAgbm9wCisgICAgICAgIGxkcmVxICAgcjgsIFtyM10gICAgICAgICAvKiBnZXQgbG9jayBjb25kaXRpb24gZm9yIGRwbGwgKi8KKyAgICAgICAgY21wICAgICByOCwgIzB4NCAgICAgICAgIC8qIGZpcnN0IHRpbWUgdGhvdWdoPyAqLworICAgICAgICBibmUgICAgIDJiCisgICAgICAgIG1vdmVxICAgcjgsICMweDIgICAgICAgICAvKiBzZXQgdG8gZHBsbCBjaGVjayBjb25kaXRpb24uICovCisgICAgICAgIGJlcSAgICAgM2IgICAgICAgICAgICAgICAvKiBpZiBjb25kaXRpb24gbm90IHRydWUgYnJhbmNoICovCis0OiAgCisgICAgICAgIGxkciAgICAgcjQsIFtzcF0KKyAgICAgICAgYWRkICAgICBzcCwgc3AsICMweDQgICAgIC8qIHJldHVybiBzdGFjayBzcGFjZSAqLworICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLyAgICAgICAgCisKK19nb190b19zcGVlZDogLndvcmQgZ29fdG9fc3BlZWQKKworLyogdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gYmUgY2xvc2UgZm9yIFBJQyBjb2RlICovCisjaWZkZWYgQ0ZHX09ORU5BTkQKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzNfMCAKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgT05FTkFORF9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzRfMAorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIE9ORU5BTkRfR1BNQ19DT05GSUc0CitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUcxXzAKKyNlbHNlCitmbGFzaF9jZmczX2FkZHI6CisgICAgLndvcmQgR1BNQ19DT05GSUczXzAgCitmbGFzaF9jZmczX3ZhbDogCisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzRfMAorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNNTkFORF9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCBHUE1DX0NPTkZJRzFfMAorI2VuZGlmCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9zdGF0OgorICAgIC53b3JkIENNX0lETEVTVF9DS0dFTgorcGxsX2Rpdl9hZGQ6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X3ZhbDoKKyAgICAud29yZCBEUExMX1ZBTAkvKiBEUExMIHNldHRpbmcgKDMwME1IeiBkZWZhdWx0KSAqLworCisuZ2xvYmwgcGxhdGZvcm1zZXR1cAorcGxhdGZvcm1zZXR1cDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworICAgICAgICBibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogbWFwIGludGVycnVwdCBjb250cm9sbGVyICovCisJbGRyCXIwLAlWQUxfSU5USF9TRVRVUAorCW1jcglwMTUsIDAsIHIwLCBjMTUsIGMyLCA0CisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworVkFMX0lOVEhfU0VUVVA6CisJLndvcmQgUEVSSUZFUkFMX1BPUlRfQkFTRQorU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMjQzMHNkcC94LWxvYWQubGRzIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJlOGY4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDI0MzBzZHAveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogSmFudWFyeSAyMDA0IC0gQ2hhbmdlZCB0byBzdXBwb3J0IEg0IGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L2FybTExMzYvc3RhcnQubwkoLnRleHQpCisJICAqKC50ZXh0KQorCX0KKworCS4gPSBBTElHTig0KTsKKwkucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZGF0YSA6IHsgKiguZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5nb3QgOiB7ICooLmdvdCkgfQorCisJLiA9IEFMSUdOKDQpOworCV9fYnNzX3N0YXJ0ID0gLjsKKwkuYnNzIDogeyAqKC5ic3MpIH0KKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ3OGI4YTMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLCAyMDAxLCAyMDAyCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKEJPQVJEKS5hCisKK09CSlMJOj0gb21hcDM0MzBzZHAubworU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDZhZDZjNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvY29uZmlnLm1rCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgU0RQMzQzMCBib2FyZCB1c2VzIE9NQVAzNDMwIChBUk0tQ29ydGV4QTgpIGNwdQorIyBzZWUgaHR0cDovL3d3dy50aS5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFRleGFzIEluc3RydW1lbnRzCisjCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDEyOE1CIG1ERFItU0RSQU0gb24gQ1MwCisjIFNEUDM0MzAgaGFzIDEgYmFuayBvZiAzMk1CIG9yIDAwTUIgbUREUi1TRFJBTSBvbiBDUzEKKyMgUGh5c2ljYWwgQWRkcmVzczoKKyMgODAwMCcwMDAwIChiYW5rMCkKKyMgQTAwMCcwMDAwIChiYW5rMSkgLSByZS1tYXBwYWJsZSBiZWxvdyBDUzEKKworIyBGb3IgdXNlIGlmIHlvdSB3YW50IFgtTG9hZGVyIHRvIHJlbG9jYXRlIGZyb20gU1JBTSB0byBERFIKKyNURVhUX0JBU0UgPSAweDgwZTgwMDAwCisKKyMgRm9yIFhJUCBpbiA2NEsgb2YgU1JBTSBvciBkZWJ1ZyAoR1AgZGV2aWNlIGhhcyBpdCBhbGwgYXZhaWxhYmUpCisjIFNSQU0gNDAyMDAwMDAtNDAyMEZGRkYgYmFzZQorIyBpbml0aWFsIHN0YWNrIGF0IDB4NDAyMGZmZmMgdXNlZCBpbiBzX2luaXQgKGJlbG93IHhsb2FkZXIpLgorIyBUaGUgcnVuIHRpbWUgc3RhY2sgaXMgKGFib3ZlIHhsb2FkZXIsIDJrIGJlbG93KQorIyBJZiBhbnkgZ2xvYmFscyBleGlzdCB0aGVyZSBuZWVkcyB0byBiZSByb29tIGZvciB0aGVtIGFsc28KK1RFWFRfQkFTRSA9IDB4NDAyMDg4MDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3Ivb21hcDM0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3Ivb21hcDM0MzBzZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjlmZWRiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBsYWJyYWRvci9vbWFwMzQzMHNkcC5jCkBAIC0wLDAgKzEsNzQ0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2LTIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworc3RydWN0IGRwbGxfcGFyYW0geworICAgICAgICB1bnNpZ25lZCBpbnQgbTsKKyAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgIHVuc2lnbmVkIGludCBmc2VsOworICAgICAgICB1bnNpZ25lZCBpbnQgbTI7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkcGxsX3BhcmFtIGRwbGxfcGFyYW07CisKKyNkZWZpbmUgTUFYX1NJTF9JTkRFWAkzCisKKy8qIEZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGZyb20gbG93bGV2ZWxfaW5pdC5TICovCitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkZWxheQorICogRGVzY3JpcHRpb246IHNwaW5uaW5nIGRlbGF5IHRvIHVzZSBiZWZvcmUgdWRlbGF5IHdvcmtzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iICJzdWJzICUwLCAlMSwgIzFcbiIKKwkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIihsb29wcykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGJvYXJkX2luaXQKKyAqIERlc2NyaXB0aW9uOiBFYXJseSBoYXJkd2FyZSBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGJvYXJkX2luaXQgKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgZ2V0X2RldmljZV90eXBlKCk6IHRlbGwgaWYgR1AvSFMvRU1VL1RTVAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpCit7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBtb2RlID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TVEFUVVMpICYgKERFVklDRV9NQVNLKTsKKyAgICAgICAgcmV0dXJuKG1vZGUgPj49IDgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBnZXRfY3B1X3Jldih2b2lkKSAtIGV4dHJhY3QgdmVyc2lvbiBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9jcHVfcmV2KHZvaWQpCit7CisJdTMyIGNwdWlkPTA7CisJLyogT24gRVMxLjAgdGhlIElEQ09ERSByZWdpc3RlciBpcyBub3QgZXhwb3NlZCBvbiBMNAorCSAqIHNvIHVzaW5nIENQVSBJRCB0byBkaWZmZXJlbnRpYXRlCisJICogYmV0d2VlbiBFUzIuMCBhbmQgRVMxLjAuCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1yYyBwMTUsIDAsICUwLCBjMCwgYzAsIDAiOiI9ciIgKGNwdWlkKSk7CisJaWYoKGNwdWlkICAmIDB4ZikgPT0gMHgwKQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMxOworCWVsc2UKKwkJcmV0dXJuIENQVV8zNDMwX0VTMjsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfMzQzMFNEUkFNX0REUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8wKTsKKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfUkZSX0NUUkwsIFNEUkNfUkZSX0NUUkwpOworCisJLyogaW5pdCBzZXF1ZW5jZSBmb3IgbUREUi9tU0RSIHVzaW5nIG1hbnVhbCBjb21tYW5kcyAoRERSIGlzIGRpZmZlcmVudCkgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCk7CisJZGVsYXkoNTAwMCk7CisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCV9fcmF3X3dyaXRlbChDTURfQVVUT1JFRlJFU0gsIFNEUkNfTUFOVUFMXzApOworCisJLyogc2V0IG1yMCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wKTsKKworCS8qIHNldCB1cCBkbGwgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfRExMQUJfQ1RSTCwgU0RSQ19ETExBX0NUUkwpOworCWRlbGF5KDB4MjAwMCk7CS8qIGdpdmUgdGltZSB0byBsb2NrICovCisKK30KKyNlbmRpZiAvLyBDRkdfMzQzMFNEUkFNX0REUgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtfc3BlZWQgLSBkZXRlcm1pbmUgcmVmZXJlbmNlIG9zY2lsbGF0b3Igc3BlZWQKKyAqICBiYXNlZCBvbiBrbm93biAzMmtIeiBjbG9jayBhbmQgZ3B0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9vc2NfY2xrX3NwZWVkKHZvaWQpCit7CisJdTMyIHN0YXJ0LCBjc3RhcnQsIGNlbmQsIGNkaWZmLCB2YWw7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChQUk1fQ0xLU1JDX0NUUkwpOworCS8qIElmIFNZU19DTEsgaXMgYmVpbmcgZGl2aWRlZCBieSAyLCByZW1vdmUgZm9yIG5vdyAqLworCXZhbCA9ICh2YWwgJiAofkJJVDcpKSB8IEJJVDY7CisJX19yYXdfd3JpdGVsKHZhbCwgUFJNX0NMS1NSQ19DVFJMKTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24gCisgKiAgIC0tIGlucHV0IG9zY2lsbGF0b3IgY2xvY2sgZnJlcXVlbmN5LgorICogICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3N5c19jbGtpbl9zZWwodTMyIG9zY19jbGssIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlpZihvc2NfY2xrID09IFMzOF80TSkKKwkJKnN5c19jbGtpbl9zZWw9ICA0OworCWVsc2UgaWYob3NjX2NsayA9PSBTMjZNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDM7CisJZWxzZSBpZihvc2NfY2xrID09IFMxOV8yTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAyOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTNNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDE7CisJZWxzZSBpZihvc2NfY2xrID09IFMxMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwlkcGxsX3BhcmFtICpkcGxsX3BhcmFtX3A7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCW9zY19jbGsgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKG9zY19jbGssICZzeXNfY2xraW5fc2VsKTsKKworCXNyMzIoUFJNX0NMS1NFTCwgMCwgMywgc3lzX2Nsa2luX3NlbCk7IC8qIHNldCBpbnB1dCBjcnlzdGFsIHNwZWVkICovCisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUvMiAqLworCWlmKHN5c19jbGtpbl9zZWwgPiAyKSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAyKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwvMjsKKwl9IGVsc2UgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMSk7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsOworCX0KKworCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCAwLCAyLCAwKTsvKiBCeXBhc3MgbW9kZTogVDIgaW5wdXRzIGEgc3F1YXJlIGNsb2NrICovCisKKwkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkgKiBzaWxpY29uIHJldmlzaW9uLiBUaGUgY2xrX2luZGV4IHZhbHVlIHdpbGwgYmUgdXNlZCB0byBnZXQKKwkgKiB0aGUgdmFsdWVzIGZvciB0aGF0IGlucHV0IHN5c2NsayBmcm9tIHRoZSBEUExMIHBhcmFtIHRhYmxlCisJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlIAorCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LiAKKwkgKi8KKwlpZihjcHVfaXNfMzQxMCgpKQorCQlzaWxfaW5kZXggPSAyOworCWVsc2UgeworCQlpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMSkKKwkJCXNpbF9pbmRleCA9IDA7CisJCWVsc2UgaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzIpCisJCQlzaWxfaW5kZXggPSAxOworCX0JCisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwkJLyogRm9yIDM0MzAgRVMxLjAgRXJyYXRhIDEuNTAsIGRlZmF1bHQgdmFsdWUgZGlyZWN0bHkgZG9lc250CisJCSAgIHdvcmsuIHdyaXRlIGFub3RoZXIgdmFsdWUgYW5kIHRoZW4gZGVmYXVsdCB2YWx1ZS4gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyICsgMSk7CS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJCS8qIG0zeDIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgMiwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIFNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogU2V0IE0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCA4LCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOwkJCS8qIDk2TSBTcmMgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgRVMxIG9ubHkgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgMCwgMywgR0ZYX0RJVik7CQkvKiBnZnggKi8KKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAxLCAyLCBXS1VQX1JTTSk7CQkvKiByZXNldCBtZ3IgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBQRVIgIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X3Blcl9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIGNsa19pbmRleDsKKwkvKiBQRVIgRFBMTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMSwgMCwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMV9FTVUsIDI0LCA1LCBQRVJfTTZYMik7CS8qIHNldCBNNiAqLworCXNyMzIoQ01fQ0xLU0VMX0NBTSwgMCwgNSwgUEVSX001WDIpOwkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJLyogc2V0IE00ICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCA4LCA1LCBQRVJfTTNYMik7CS8qIHNldCBNMyAqLworCXNyMzIoQ01fQ0xLU0VMM19QTEwsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMSwgZHBsbF9wYXJhbV9wLT5tKTsJLyogc2V0IG0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgbiAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIE1QVSBEUExMICh1bmxvY2tlZCBhbHJlYWR5KSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfTVBVLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBTZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOyAvKiBsb2NrIG1vZGUgKi8KKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9pdmFfZHBsbF9wYXJhbSgpOworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCWRwbGxfcGFyYW1fcCA9IGRwbGxfcGFyYW1fcCArIE1BWF9TSUxfSU5ERVgqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCS8qIElWQSBEUExMIChzZXQgdG8gMTIqMjA9MjQwTUh6KSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9QTExfSVZBMiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDJfUExMX0lWQTIsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBzZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgTSAqLworICAJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBkcGxsX3BhcmFtX3AtPm4pOwkvKiBzZXQgTiAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIGRwbGxfcGFyYW1fcC0+ZnNlbCk7CS8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfTE9DSyk7CS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogU2V0IHVwIEdQVGltZXJzIHRvIHN5c19jbGsgc291cmNlIG9ubHkgKi8KKyAJc3IzMihDTV9DTEtTRUxfUEVSLCAwLCA4LCAweGZmKTsKKwlzcjMyKENNX0NMS1NFTF9XS1VQLCAwLCAxLCAxKTsKKworCWRlbGF5KDUwMDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNlY3VyZV91bmxvY2sKKyAqIERlc2NyaXB0aW9uOiBTZXR1cCBzZWN1cml0eSByZWdpc3RlcnMgZm9yIGFjY2VzcworICogKEdQIERldmljZSBvbmx5KQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZWN1cmVfdW5sb2NrKHZvaWQpCit7CisJLyogUGVybWlzc2lvbiB2YWx1ZXMgZm9yIHJlZ2lzdGVycyAtRnVsbCBmbGVkZ2VkIHBlcm1pc3Npb25zIHRvIGFsbCAqLworCSNkZWZpbmUgVU5MT0NLXzEgMHhGRkZGRkZGRgorCSNkZWZpbmUgVU5MT0NLXzIgMHgwMDAwMDAwMAorCSNkZWZpbmUgVU5MT0NLXzMgMHgwMDAwRkZGRgorCS8qIFByb3RlY3Rpb24gTW9kdWxlIFJlZ2lzdGVyIFRhcmdldCBBUEUgKFBNX1JUKSovCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRVFfSU5GT19QRVJNSVNTSU9OXzEpOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIFJUX0FERFJfTUFUQ0hfMSk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fV1JJVEVfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzIsIE9DTV9BRERSX01BVENIXzIpOworCisJLyogSVZBIENoYW5nZXMgKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVRX0lORk9fUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9XUklURV9QRVJNSVNTSU9OXzApOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBTTVNfUkdfQVRUMCk7IC8qIFNEUkMgcmVnaW9uIDAgcHVibGljICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB0cnlfdW5sb2NrX3NyYW0oKQorICogRGVzY3JpcHRpb246IElmIGNoaXAgaXMgR1AgdHlwZSwgdW5sb2NrIHRoZSBTUkFNIGZvcgorICogIGdlbmVyYWwgdXNlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB0cnlfdW5sb2NrX21lbW9yeSh2b2lkKQoreworCWludCBtb2RlOworCisJLyogaWYgR1AgZGV2aWNlIHVubG9jayBkZXZpY2UgU1JBTSBmb3IgZ2VuZXJhbCB1c2UgKi8KKwkvKiBzZWN1cmUgY29kZSBicmVha3MgZm9yIFNlY3VyZS9FbXVsYXRpb24gZGV2aWNlIC0gSFMvRS9UKi8KKwltb2RlID0gZ2V0X2RldmljZV90eXBlKCk7CisJaWYgKG1vZGUgPT0gR1BfREVWSUNFKSB7CisJCXNlY3VyZV91bmxvY2soKTsKKwl9CisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc19pbml0CisgKiBEZXNjcmlwdGlvbjogRG9lcyBlYXJseSBzeXN0ZW0gaW5pdCBvZiBtdXhpbmcgYW5kIGNsb2Nrcy4KKyAqIC0gQ2FsbGVkIGF0IHRpbWUgd2hlbiBvbmx5IHN0YWNrIGlzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHNfaW5pdCh2b2lkKQoreworCXdhdGNoZG9nX2luaXQoKTsKKyNpZmRlZiBDT05GSUdfMzQzMF9BU18zNDEwCisJLyogc2V0dXAgdGhlIHNjYWxhYmlsaXR5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIAorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ18zNDMwc2RyYW1fZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorLy8vLyNpZmRlZiBDT05GSUdfU0VSSUFMMworCXNyMzIoQ01fRkNMS0VOX1BFUiwgMTEsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU5fUEVSLCAxMSwgMSwgMHgxKTsKKy8vLy8jZWxzZQorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworLy8vLyNlbmRpZgorI2VuZGlmCisJZGVsYXkoMTAwMCk7Cit9CisKKy8qIFNldCBNVVggZm9yIFVBUlQsIEdQTUMsIFNEUkMsIEdQSU8gKi8KKworLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCS8qU0RSQyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCS8qR1BNQyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkNTNSBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMSkpIC8qc3lzX25kbWFyZXExIGxhYiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0xKSkgLypHUE1DX0lPX0RJUiBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkJFMSBsYWIqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKmdwbWNfbldhaXQgbGFiKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKmdwbWNfbldhaXQgbGFiKi9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE4KSwgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkRTU19EQVRBMTgqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTkpLCAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qRFNTX0RBVEExOSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMCksICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypEU1NfREFUQTIwKi9cCisJTVVYX1ZBTChDUChDQU1fWENMS0IpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkNBTV9YQ0xLQiovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksICAgICAgKElFTiAgfCBQVFUgfCBESVMgfCBNMCkpIC8qVUFSVDFfQ1RTKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SWCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDEpLCAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypzeXNfY2xrb3V0MiBsYWIqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qc3lzX2Nsa291dDIgbGFiKi9cCisJTVVYX1ZBTChDUChKVEFHX25UUlNUKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfblRSU1QqL1wKKwlNVVhfVkFMKENQKEpUQUdfVENLKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UQ0sqL1wKKwlNVVhfVkFMKENQKEpUQUdfVE1TKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UTVMqL1wKKwlNVVhfVkFMKENQKEpUQUdfVERJKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19UREkqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUwKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTEpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMSovXAorCU1VWF9WQUwoQ1AoRVRLX0NMSyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEyKi9cCisJTVVYX1ZBTChDUChFVEtfQ1RMKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTMqL1wKKwlNVVhfVkFMKENQKEVUS19EMCApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDIgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI1Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjYqL1wKKwlNVVhfVkFMKENQKEVUS19EMTMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNyovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI4Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjkqL1wKKwlNVVhfVkFMKENQKFVBUlQzX0NUU19SQ1RYKSwgKElFTiAgfCBQVEQgfCBFTiAgfCBNMCkpIC8qVUFSVDNfQ1RTX1JDVFggKi9cCisJTVVYX1ZBTChDUChVQVJUM19SVFNfU0QpLCAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQzX1JUU19TRCAqL1wKKwlNVVhfVkFMKENQKFVBUlQzX1JYX0lSUlggKSwgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qVUFSVDNfUlhfSVJSWCovXAorCU1VWF9WQUwoQ1AoVUFSVDNfVFhfSVJUWCApLCAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUM19UWF9JUlRYKi9cCisJTVVYX1ZBTChDUChzZHJjX2NrZTApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKnNkcmNfY2tlMCAqL1wKKwlNVVhfVkFMKENQKHNkcmNfY2tlMSksICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNNykpIC8qc2RyY19ja2UxIG5vdCB1c2VkKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbmFuZF9pbml0KHZvaWQpCit7CisJLyogZ2xvYmFsIHNldHRpbmdzICovCisJX19yYXdfd3JpdGVsKDB4MTAsIEdQTUNfU1lTQ09ORklHKTsJLyogc21hcnQgaWRsZSAqLworCV9fcmF3X3dyaXRlbCgweDAsIEdQTUNfSVJRRU5BQkxFKTsJLyogaXNyJ3Mgc291cmNlcyBtYXNrZWQgKi8KKwlfX3Jhd193cml0ZWwoMCwgR1BNQ19USU1FT1VUX0NPTlRST0wpOy8qIHRpbWVvdXQgZGlzYWJsZSAqLworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKDB4MDAxLCBHUE1DX0NPTkZJRyk7CS8qIHNldCBuV1AsIGRpc2FibGUgbGltaXRlZCBhZGRyICovCisjZW5kaWYKKworCS8qIHNldHVwIENTMCBmb3IgTWljcm9uIE5BTkQsIGxlYXZlIG90aGVyIENTJ3MgdG8gdS1ib290ICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE1fTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggTV9OQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworI2Vsc2UgLyogQ0ZHX09ORU5BTkQgKi8KKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzIsIEdQTUNfQ09ORklHMiArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzUsIEdQTUNfQ09ORklHNSArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKyNlbmRpZgorCisJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKwlfX3Jhd193cml0ZWwoKCAoKE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgJiAweEYpPDw4KSB8CisJCSAgICAgKChPTUFQMzRYWF9HUE1DX0NTMF9NQVA+PjI0KSAmIDB4M0YpIHwKKwkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKwlkZWxheSgyMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisgCWlmIChuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIlVuc3VwcG9ydGVkIENoaXAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZWxzZQorCWlmIChvbmVuYW5kX2NoaXAoKSl7CisjaWZkZWYgQ0ZHX1BSSU5URgorCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKy8qIG9wdGlvbmFsbHkgZG8gc29tZXRoaW5nIGxpa2UgYmxpbmtpbmcgTEVEICovCit2b2lkIGJvYXJkX2hhbmcgKHZvaWQpCit7IHdoaWxlICgwKSB7fTt9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTg2OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IvcGxhdGZvcm0uUwpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIEJvYXJkIHNwZWNpZmljIHNldHVwIGluZm8KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UJLyogc2RyYW0gbG9hZCBhZGRyIGZyb20gY29uZmlnLm1rICovCisKKyNpZiAhZGVmaW5lZChDRkdfTkFORF9CT09UKSAmJiAhZGVmaW5lZChDRkdfTkFORF9CT09UKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHlfY2xrX2NvZGU6IHJlbG9jYXRlcyBjbG9jayBjb2RlIGludG8gU1JBTSB3aGVyZSBpdHMgc2FmZXIgdG8gZXhlY3V0ZQorICogUjEgPSBTUkFNIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgY3B5X2Nsa19jb2RlCisgY3B5X2Nsa19jb2RlOgorICAgICAgICAvKiBDb3B5IERQTEwgY29kZSBpbnRvIFNSQU0gKi8gCisgICAgICAgIGFkciAgICAgcjAsIGdvX3RvX3NwZWVkICAgICAgICAgLyogZ2V0IGFkZHIgb2YgY2xvY2sgc2V0dGluZyBjb2RlICovCisgICAgICAgIG1vdiAgICAgcjIsICMzODQgICAgICAgICAgICAgICAgLyogcjIgc2l6ZSB0byBjb3B5IChkaXYgYnkgMzIgYnl0ZXMpICovCisgICAgICAgIG1vdiAgICAgcjEsIHIxICAgICAgICAgICAgICAgICAgLyogcjEgPC0gZGVzdCBhZGRyZXNzIChwYXNzZWQgaW4pICovCisgICAgICAgIGFkZCAgICAgcjIsIHIyLCByMCAgICAgICAgICAgICAgLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICovCituZXh0MjoKKyAgICAgICAgbGRtaWEgICByMCEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworICAgICAgICBzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisgICAgICAgIGNtcCAgICAgcjAsIHIyICAgICAgICAgICAgICAgICAgLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKyAgICAgICAgYm5lICAgICBuZXh0MgorCW1vdglwYywgbHIgICAgICAgICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4gIAorKiAgIEl0IGNvdWxkIGJlIHJlbW92ZWQgaXRzIGlzIGtlcHQgZm9yIGNvbXBhdGFiaWx5IHdpdGggdS1ib290LgorICoKKyAqICBnb190b19zcGVlZDogLU1vdmVzIHRvIGJ5cGFzcywgLUNvbW1pdHMgY2xvY2sgZGl2aWRlcnMsIC1wdXRzIGRwbGwgYXQgc3BlZWQKKyAqICAgICAgICAgICAgICAgLWV4ZWN1dGVkIGZyb20gU1JBTS4KKyAqICBSMCA9IENNX0NMS0VOX1BMTC1ieXBhc3MgdmFsdWUKKyAqICBSMSA9IENNX0NMS1NFTDFfUExMLW0sIG4sIGFuZCBkaXZpZGVyIHZhbHVlcworICogIFIyID0gQ01fQ0xLU0VMX0NPUkUtZGl2aWRlciB2YWx1ZXMKKyAqICBSMyA9IENNX0lETEVTVF9DS0dFTiAtIGFkZHIgZHBsbCBsb2NrIHdhaXQKKyAqCisgKiAgTm90ZTogSWYgY29yZSB1bmxvY2tzL3JlbG9ja3MgYW5kIFNEUkFNIGlzIHJ1bm5pbmcgZmFzdCBhbHJlYWR5IGl0IGdldHMKKyAqICAgICAgICBjb25mdXNlZC4gIEEgcmVzZXQgb2YgdGhlIGNvbnRyb2xsZXIgZ2V0cyBpdCBiYWNrLiAgVGFraW5nIGF3YXkgaXRzCisgKiAgICAgICAgTDMgd2hlbiBpdHMgbm90IGluIHNlbGYgcmVmcmVzaCBzZWVtcyBiYWQgZm9yIGl0LiAgTm9ybWFsbHksIHRoaXMgY29kZQorICogICAgICAgIHJ1bnMgZnJvbSBmbGFzaCBiZWZvcmUgU0RSIGlzIGluaXQgc28gdGhhdCBzaG91bGQgYmUgb2suCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAKKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIAorICAgICAgICBsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDQgIC8qIGdmeCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDQgCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ1ICAvKiBlbXUgKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw1IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAKKworICAgICAgICAvKiBub3cgcHJlcGFyZSBHUE1DIChmbGFzaCkgZm9yIG5ldyBkcGxsIHNwZWVkICovCisJLyogZmxhc2ggbmVlZHMgdG8gYmUgc3RhYmxlIHdoZW4gd2UganVtcCBiYWNrIHRvIGl0ICovCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzNfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmczX3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzRfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc0X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzVfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBmbGFzaF9jZmc1X3ZhbAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIGZsYXNoX2NmZzFfYWRkcgorICAgICAgICBsZHIgICAgIHIyLCBbcjVdCisgICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHgzICAgICAvKiB1cCBncG1jIGRpdmlkZXIgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorCisgICAgICAgIC8qIGxvY2sgRFBMTDMgYW5kIHdhaXQgYSBiaXQgKi8KKyAgICAgICAgb3JyICAgICByMCwgcjAsICMweDcgICAvKiBzZXQgdXAgZm9yIGxvY2sgbW9kZSAqLyAgICAgCisgICAgICAgIHN0ciAgICAgcjAsIFtyNF0gICAgICAgLyogbG9jayAqLworICAgICAgICBub3AgICAgICAgICAgICAgICAgICAgIC8qIEFSTSBzbG93IGF0IHRoaXMgcG9pbnQgd29ya2luZyBhdCBzeXNfY2xrICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCit3YWl0MjoKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYm5lICAgICB3YWl0MiAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBsZG1mZCBzcCEsIHtyNC1yNn0KKyAgICAgICAgbW92ICAgICBwYywgbHIgICAgICAgICAgIC8qIGJhY2sgdG8gY2FsbGVyLCBsb2NrZWQgKi8gICAgICAgIAorCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6IAorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzMKK2ZsYXNoX2NmZzRfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc0KQorZmxhc2hfY2ZnNF92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNAorZmxhc2hfY2ZnNV92YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHNQorZmxhc2hfY2ZnNV9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzUpCitwbGxfY3RsX2FkZDoKKyAgICAud29yZCBDTV9DTEtFTl9QTEwKK3BsbF9kaXZfYWRkMToKKyAgICAud29yZCBDTV9DTEtTRUwxX1BMTCAKK3BsbF9kaXZfYWRkMjoKKyAgICAud29yZCBDTV9DTEtTRUxfQ09SRQorcGxsX2Rpdl9hZGQzOgorICAgIC53b3JkIENNX0NMS1NFTF9XS1VQCitwbGxfZGl2X3ZhbDM6CisgICAgLndvcmQgKFdLVVBfUlNNIDw8IDEpIAorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKSAKK3BsbF9kaXZfYWRkNToKKyAgICAud29yZCBDTV9DTEtTRUwxX0VNVQorcGxsX2Rpdl92YWw1OgorICAgIC53b3JkIENMU0VMMV9FTVVfVkFMCisKKyNlbmRpZgorCisuZ2xvYmwgbG93bGV2ZWxfaW5pdAorbG93bGV2ZWxfaW5pdDoKKwlsZHIJc3AsCVNSQU1fU1RBQ0sKKyAgICAgICAgc3RyICAgICBpcCwJW3NwXSAgICAvKiBzdGFzaCBvbGQgbGluayByZWdpc3RlciAqLworCW1vdglpcCwJbHIJLyogc2F2ZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisvKiBEUExMKDEtNCkgUEFSQU0gVEFCTEVTICovCisvKiBFYWNoIG9mIHRoZSB0YWJsZXMgaGFzIE0sIE4sIEZSRVFTRUwsIE0yIHZhbHVlcyBkZWZpbmVkIGZvciBub21pbmFsCisgKiBPUFAgKDEuMlYpLiBUaGUgZmllbGRzIGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byBkcGxsX3BhcmFtIHN0cnVjdChjbG9jay5jKS4gCisgKiBUaGUgdmFsdWVzIGFyZSBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgc3lzY2xrIGFuZCBmb3IgRVMxIGFuZCBFUzIuCisgKi8KKworbXB1X2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDBGRSwweDA3LDB4MDUsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisgCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTc5LDB4MTIsMHgwNCwweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxLDB4MTcsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RCwweDE5LDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBGQSwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDFGQSwweDMyLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDJGLDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X21wdV9kcGxsX3BhcmFtCitnZXRfbXB1X2RwbGxfcGFyYW06CisJYWRyIHIwLCBtcHVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworaXZhX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDA1LDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDA1LDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwNSwweDA3LDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEsMHgwQywweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgsMHgwQywweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTBBLDB4MEMsMHgwMywweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwODIsMHgwOSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRTEsMHgwQiwweDA2LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MTcsMHgwMywweDAxCisKKy8qIDI2TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDdELDB4MEMsMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEI0LDB4MEMsMHgwNywweDAxCisvKiAzNDEwICovCisud29yZCAweDA4NSwweDBDLDB4MDcsMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGLDB4MzAsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MTcsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDJGLDB4MDMsMHgwMQorCisKKy5nbG9ibCBnZXRfaXZhX2RwbGxfcGFyYW0KK2dldF9pdmFfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGl2YV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBDb3JlIERQTEwgdGFyZ2V0cyBmb3IgTDMgYXQgMTY2ICYgTDEzMyAqLworY29yZV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8xMl9FUzEsTV8xMl9FUzEsRlNMXzEyX0VTMSxNMl8xMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xMixOXzEyLEZTRUxfMTIsTTJfMTIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTNfRVMxLE5fMTNfRVMxLEZTTF8xM19FUzEsTTJfMTNfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTMsTl8xMyxGU0VMXzEzLE0yXzEzCisvKiAzNDEwICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTlwMl9FUzEsTl8xOXAyX0VTMSxGU0xfMTlwMl9FUzEsTTJfMTlwMl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorLyogMzQxMCAqLworLndvcmQgTV8xOXAyLE5fMTlwMixGU0VMXzE5cDIsTTJfMTlwMgorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCBNXzI2X0VTMSxOXzI2X0VTMSxGU0xfMjZfRVMxLE0yXzI2X0VTMQorLyogRVMyICovCisud29yZCBNXzI2LE5fMjYsRlNFTF8yNixNMl8yNgorLyogMzQxMCAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCBNXzM4cDRfRVMxLE5fMzhwNF9FUzEsRlNMXzM4cDRfRVMxLE0yXzM4cDRfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKy8qIDM0MTAgKi8KKy53b3JkIE1fMzhwNCxOXzM4cDQsRlNFTF8zOHA0LE0yXzM4cDQKKworLmdsb2JsIGdldF9jb3JlX2RwbGxfcGFyYW0KK2dldF9jb3JlX2RwbGxfcGFyYW06CisJYWRyIHIwLCBjb3JlX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qIFBFUiBEUExMIHZhbHVlcyBhcmUgc2FtZSBmb3IgYm90aCBFUzEgYW5kIEVTMiAqLworcGVyX2RwbGxfcGFyYW06CisvKiAxMk1IeiAqLworLndvcmQgMHhEOCwweDA1LDB4MDcsMHgwOQorCisvKiAxM01IeiAqLworLndvcmQgMHgxQjAsMHgwQywweDAzLDB4MDkKKworLyogMTkuMk1IeiAqLworLndvcmQgMHhFMSwweDA5LDB4MDcsMHgwOQorCisvKiAyNk1IeiAqLworLndvcmQgMHhEOCwweDBDLDB4MDcsMHgwOQorCisvKiAzOC40TUh6ICovCisud29yZCAweEUxLDB4MTMsMHgwNywweDA5CisKKy5nbG9ibCBnZXRfcGVyX2RwbGxfcGFyYW0KK2dldF9wZXJfZHBsbF9wYXJhbToKKwlhZHIgcjAsIHBlcl9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMGxhYnJhZG9yL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQwMmY3NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwbGFicmFkb3IveC1sb2FkLmxkcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTm92ZW1iZXIgMjAwNiAtIENoYW5nZWQgdG8gc3VwcG9ydCAzNDMwc2RwIGRldmljZSAKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IFRleGFzIEluc3RydW1lbnRzIAorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZSBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWNlMTcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChCT0FSRCkuYQorCitPQkpTCTo9IG9tYXAzNDMwc2RwLm8gCitTT0JKUwk6PSBwbGF0Zm9ybS5vCisKKyQoTElCKToJJChPQkpTKSAkKFNPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJF4KKworY2xlYW46CisJcm0gLWYgJChTT0JKUykgJChPQkpTKQorCitkaXN0Y2xlYW46CWNsZWFuCisJcm0gLWYgJChMSUIpIGNvcmUgKi5iYWsgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rIGIveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YWQ2YzUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwMzQzMHNkcC9jb25maWcubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDYKKyMgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorIworIyBTRFAzNDMwIGJvYXJkIHVzZXMgT01BUDM0MzAgKEFSTS1Db3J0ZXhBOCkgY3B1CisjIHNlZSBodHRwOi8vd3d3LnRpLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMTI4TUIgbUREUi1TRFJBTSBvbiBDUzAKKyMgU0RQMzQzMCBoYXMgMSBiYW5rIG9mIDMyTUIgb3IgMDBNQiBtRERSLVNEUkFNIG9uIENTMQorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorIyBBMDAwJzAwMDAgKGJhbmsxKSAtIHJlLW1hcHBhYmxlIGJlbG93IENTMQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwODgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvb21hcDM0MzBzZHAuYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwOWFhZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL29tYXAzNDMwc2RwLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cGFydC5oPgorI2luY2x1ZGUgPGZhdC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JpdHMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zeXNfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorCisvKiBVc2VkIHRvIGluZGV4IGludG8gRFBMTCBwYXJhbWV0ZXIgdGFibGVzICovCitzdHJ1Y3QgZHBsbF9wYXJhbSB7CisgICAgICAgIHVuc2lnbmVkIGludCBtOworICAgICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGZzZWw7CisgICAgICAgIHVuc2lnbmVkIGludCBtMjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICogZ2V0X21wdV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9pdmFfZHBsbF9wYXJhbSgpOworZXh0ZXJuIGRwbGxfcGFyYW0gKiBnZXRfY29yZV9kcGxsX3BhcmFtKCk7CitleHRlcm4gZHBsbF9wYXJhbSAqIGdldF9wZXJfZHBsbF9wYXJhbSgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBib2FyZF9pbml0CisgKiBEZXNjcmlwdGlvbjogRWFybHkgaGFyZHdhcmUgaW5pdC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBib2FyZF9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIGdldF9kZXZpY2VfdHlwZSgpOiB0ZWxsIGlmIEdQL0hTL0VNVS9UU1QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9kZXZpY2VfdHlwZSh2b2lkKQoreworICAgICAgICBpbnQgbW9kZTsKKyAgICAgICAgbW9kZSA9IF9fcmF3X3JlYWRsKENPTlRST0xfU1RBVFVTKSAmIChERVZJQ0VfTUFTSyk7CisgICAgICAgIHJldHVybihtb2RlID4+PSA4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X2NwdV9yZXYodm9pZCkgLSBleHRyYWN0IHZlcnNpb24gaW5mbworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfY3B1X3Jldih2b2lkKQoreworCXUzMiBjcHVpZD0wOworCS8qIE9uIEVTMS4wIHRoZSBJRENPREUgcmVnaXN0ZXIgaXMgbm90IGV4cG9zZWQgb24gTDQKKwkgKiBzbyB1c2luZyBDUFUgSUQgdG8gZGlmZmVyZW50aWF0ZQorCSAqIGJldHdlZW4gRVMyLjAgYW5kIEVTMS4wLgorCSAqLworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtcmMgcDE1LCAwLCAlMCwgYzAsIGMwLCAwIjoiPXIiIChjcHVpZCkpOworCWlmKChjcHVpZCAgJiAweGYpID09IDB4MCkKKwkJcmV0dXJuIENQVV8zNDMwX0VTMTsKKwllbHNlCisJCXJldHVybiBDUFVfMzQzMF9FUzI7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B1X2lzXzM0MTAodm9pZCkgLSByZXR1cm5zIHRydWUgZm9yIDM0MTAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgY3B1X2lzXzM0MTAodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCWlmKGdldF9jcHVfcmV2KCkgPCBDUFVfMzQzMF9FUzIpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogcmVhZCBzY2FsYWJpbGl0eSBzdGF0dXMgYW5kIHJldHVybiAxIGZvciAzNDEwKi8KKwkJc3RhdHVzID0gX19yYXdfcmVhZGwoQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUyk7CisJCS8qIENoZWNrIHdoZXRoZXIgTVBVIGZyZXF1ZW5jeSBpcyBzZXQgdG8gMjY2IE1IeiB3aGljaAorCQkgKiBpcyBub21pbmFsIGZvciAzNDEwLiBJZiB5ZXMgcmV0dXJuIHRydWUgZWxzZSBmYWxzZQorCQkgKi8KKwkJaWYgKCgoc3RhdHVzID4+IDgpICYgMHgzKSA9PSAweDIpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHNyMzIgLSBjbGVhciAmIHNldCBhIHZhbHVlIGluIGEgYml0IHJhbmdlIGZvciBhIDMyIGJpdCBhZGRyZXNzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKQoreworCXUzMiB0bXAsIG1zayA9IDA7CisJbXNrID0gMSA8PCBudW1fYml0czsKKwktLW1zazsKKwl0bXAgPSBfX3Jhd19yZWFkbChhZGRyKSAmIH4obXNrIDw8IHN0YXJ0X2JpdCk7CisJdG1wIHw9ICB2YWx1ZSA8PCBzdGFydF9iaXQ7CisJX19yYXdfd3JpdGVsKHRtcCwgYWRkcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhaXRfb25fdmFsdWUoKSAtIGNvbW1vbiByb3V0aW5lIHRvIGFsbG93IHdhaXRpbmcgZm9yIGNoYW5nZXMgaW4KKyAqICAgdm9sYXRpbGUgcmVncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgd2FpdF9vbl92YWx1ZSh1MzIgcmVhZF9iaXRfbWFzaywgdTMyIG1hdGNoX3ZhbHVlLCB1MzIgcmVhZF9hZGRyLCB1MzIgYm91bmQpCit7CisJdTMyIGkgPSAwLCB2YWw7CisJZG8geworCQkrK2k7CisJCXZhbCA9IF9fcmF3X3JlYWRsKHJlYWRfYWRkcikgJiByZWFkX2JpdF9tYXNrOworCQlpZiAodmFsID09IG1hdGNoX3ZhbHVlKQorCQkJcmV0dXJuICgxKTsKKwkJaWYgKGkgPT0gYm91bmQpCisJCQlyZXR1cm4gKDApOworCX0gd2hpbGUgKDEpOworfQorCisjaWZkZWYgQ0ZHXzM0MzBTRFJBTV9ERFIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNvbmZpZ18zNDMwc2RyYW1fZGRyKCkgLSBJbml0IEREUiBvbiAzNDMwU0RQIGRldiBib2FyZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNvbmZpZ18zNDMwc2RyYW1fZGRyKHZvaWQpCit7CisJLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisJX19yYXdfd3JpdGVsKFNPRlRSRVNFVCwgU0RSQ19TWVNDT05GSUcpOworCXdhaXRfb25fdmFsdWUoQklUMCwgQklUMCwgU0RSQ19TVEFUVVMsIDEyMDAwMDAwKTsKKwlfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisJLyogc2V0dXAgc2RyYyB0byBiYWxsIG11eCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19TSEFSSU5HLCBTRFJDX1NIQVJJTkcpOworCisJLyogc2V0IG1kY2ZnICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01EQ0ZHXzBfRERSLCBTRFJDX01DRkdfMCk7CisKKwkvKiBzZXQgdGltaW5nICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxBXzAsIFNEUkNfQUNUSU1fQ1RSTEFfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1JGUl9DVFJMLCBTRFJDX1JGUl9DVFJMKTsKKworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKEREUiBpcyBkaWZmZXJlbnQpICovCisJX19yYXdfd3JpdGVsKENNRF9OT1AsIFNEUkNfTUFOVUFMXzApOworCWRlbGF5KDUwMDApOworCV9fcmF3X3dyaXRlbChDTURfUFJFQ0hBUkdFLCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wKTsKKworCS8qIHNldCBtcjAgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTVJfMF9ERFIsIFNEUkNfTVJfMCk7CisKKwkvKiBzZXQgdXAgZGxsICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX0RMTEFCX0NUUkwsIFNEUkNfRExMQV9DVFJMKTsKKwlkZWxheSgweDIwMDApOwkvKiBnaXZlIHRpbWUgdG8gbG9jayAqLworCit9CisjZW5kaWYgLy8gQ0ZHXzM0MzBTRFJBTV9ERFIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKwkvKiBJZiBTWVNfQ0xLIGlzIGJlaW5nIGRpdmlkZWQgYnkgMiwgcmVtb3ZlIGZvciBub3cgKi8KKwl2YWwgPSAodmFsICYgKH5CSVQ3KSkgfCBCSVQ2OworCV9fcmF3X3dyaXRlbCh2YWwsIFBSTV9DTEtTUkNfQ1RSTCk7CisKKwkvKiBlbmFibGUgdGltZXIyICovCisJdmFsID0gX19yYXdfcmVhZGwoQ01fQ0xLU0VMX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9DTEtTRUxfV0tVUCk7CS8qIHNlbGVjdCBzeXNfY2xrIGZvciBHUFQxICovCisKKwkvKiBFbmFibGUgSSBhbmQgRiBDbG9ja3MgZm9yIEdQVDEgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9JQ0xLRU5fV0tVUCkgfCBCSVQwIHwgQklUMjsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9JQ0xLRU5fV0tVUCk7CisJdmFsID0gX19yYXdfcmVhZGwoQ01fRkNMS0VOX1dLVVApIHwgQklUMDsKKwlfX3Jhd193cml0ZWwodmFsLCBDTV9GQ0xLRU5fV0tVUCk7CisKKwlfX3Jhd193cml0ZWwoMCwgT01BUDM0WFhfR1BUMSArIFRMRFIpOwkvKiBzdGFydCBjb3VudGluZyBhdCAwICovCisJX19yYXdfd3JpdGVsKEdQVF9FTiwgT01BUDM0WFhfR1BUMSArIFRDTFIpOyAgICAgLyogZW5hYmxlIGNsb2NrICovCisJLyogZW5hYmxlIDMya0h6IHNvdXJjZSAqLy8qIGVuYWJsZWQgb3V0IG9mIHJlc2V0ICovCisJLyogZGV0ZXJtaW5lIHN5c19jbGsgdmlhIGdhdWdpbmcgKi8KKworCXN0YXJ0ID0gMjAgKyBfX3Jhd19yZWFkbChTMzJLX0NSKTsJLyogc3RhcnQgdGltZSBpbiAyMCBjeWNsZXMgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCBzdGFydCk7CS8qIGRlYWQgbG9vcCB0aWxsIHN0YXJ0IHRpbWUgKi8KKwljc3RhcnQgPSBfX3Jhd19yZWFkbChPTUFQMzRYWF9HUFQxICsgVENSUik7CS8qIGdldCBzdGFydCBzeXNfY2xrIGNvdW50ICovCisJd2hpbGUgKF9fcmF3X3JlYWRsKFMzMktfQ1IpIDwgKHN0YXJ0ICsgMjApKTsJLyogd2FpdCBmb3IgNDAgY3ljbGVzICovCisJY2VuZCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IGVuZCBzeXNfY2xrIGNvdW50ICovCisJY2RpZmYgPSBjZW5kIC0gY3N0YXJ0OwkJCQkvKiBnZXQgZWxhcHNlZCB0aWNrcyAqLworCisJLyogYmFzZWQgb24gbnVtYmVyIG9mIHRpY2tzIGFzc2lnbiBzcGVlZCAqLworCWlmIChjZGlmZiA+IDE5MDAwKQorCQlyZXR1cm4gKFMzOF80TSk7CisJZWxzZSBpZiAoY2RpZmYgPiAxNTIwMCkKKwkJcmV0dXJuIChTMjZNKTsKKwllbHNlIGlmIChjZGlmZiA+IDEzMDAwKQorCQlyZXR1cm4gKFMyNE0pOworCWVsc2UgaWYgKGNkaWZmID4gOTAwMCkKKwkJcmV0dXJuIChTMTlfMk0pOworCWVsc2UgaWYgKGNkaWZmID4gNzYwMCkKKwkJcmV0dXJuIChTMTNNKTsKKwllbHNlCisJCXJldHVybiAoUzEyTSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xraW5fc2VsKCkgLSByZXR1cm5zIHRoZSBzeXNfY2xraW5fc2VsIGZpZWxkIHZhbHVlIGJhc2VkIG9uCisgKiAgIC0tIGlucHV0IG9zY2lsbGF0b3IgY2xvY2sgZnJlcXVlbmN5LgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZ2V0X3N5c19jbGtpbl9zZWwodTMyIG9zY19jbGssIHUzMiAqc3lzX2Nsa2luX3NlbCkKK3sKKwlpZihvc2NfY2xrID09IFMzOF80TSkKKwkJKnN5c19jbGtpbl9zZWw9ICA0OworCWVsc2UgaWYob3NjX2NsayA9PSBTMjZNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDM7CisJZWxzZSBpZihvc2NfY2xrID09IFMxOV8yTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAyOworCWVsc2UgaWYob3NjX2NsayA9PSBTMTNNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDE7CisJZWxzZSBpZihvc2NfY2xrID09IFMxMk0pCisJCSpzeXNfY2xraW5fc2VsID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwlkcGxsX3BhcmFtICpkcGxsX3BhcmFtX3A7CisJdTMyIGNsa19pbmRleCwgc2lsX2luZGV4OworCisJLyogR2F1Z2UgdGhlIGlucHV0IGNsb2NrIHNwZWVkIGFuZCBmaW5kIG91dCB0aGUgc3lzX2Nsa2luX3NlbAorCSAqIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IGNsb2NrLgorCSAqLworCW9zY19jbGsgPSBnZXRfb3NjX2Nsa19zcGVlZCgpOworCWdldF9zeXNfY2xraW5fc2VsKG9zY19jbGssICZzeXNfY2xraW5fc2VsKTsKKworCXNyMzIoUFJNX0NMS1NFTCwgMCwgMywgc3lzX2Nsa2luX3NlbCk7IC8qIHNldCBpbnB1dCBjcnlzdGFsIHNwZWVkICovCisKKwkvKiBJZiB0aGUgaW5wdXQgY2xvY2sgaXMgZ3JlYXRlciB0aGFuIDE5LjJNIGFsd2F5cyBkaXZpZGUvMiAqLworCWlmKHN5c19jbGtpbl9zZWwgPiAyKSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAyKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWwvMjsKKwl9IGVsc2UgeworCQlzcjMyKFBSTV9DTEtTUkNfQ1RSTCwgNiwgMiwgMSk7LyogaW5wdXQgY2xvY2sgZGl2aWRlciAqLworCQljbGtfaW5kZXggPSBzeXNfY2xraW5fc2VsOworCX0KKworCS8qIFRoZSBEUExMIHRhYmxlcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gc3lzY2xrIHZhbHVlIGFuZAorCSAqIHNpbGljb24gcmV2aXNpb24uIFRoZSBjbGtfaW5kZXggdmFsdWUgd2lsbCBiZSB1c2VkIHRvIGdldAorCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkgKiBhbmQgc2lsX2luZGV4IHdpbGwgZ2V0IHRoZSB2YWx1ZXMgZm9yIHRoYXQgU3lzQ2xrIGZvciB0aGUKKwkgKiBhcHByb3ByaWF0ZSBzaWxpY29uIHJldi4KKwkgKi8KKwlpZihjcHVfaXNfMzQxMCgpKQorCQlzaWxfaW5kZXggPSAyOworCWVsc2UgeworCQlpZihnZXRfY3B1X3JldigpID09IENQVV8zNDMwX0VTMSkKKwkJCXNpbF9pbmRleCA9IDA7CisJCWVsc2UgaWYoZ2V0X2NwdV9yZXYoKSA9PSBDUFVfMzQzMF9FUzIpCisJCQlzaWxfaW5kZXggPSAxOworCX0JCisKKwkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPV19QT1dFUl9CWVBBU1MpOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3Mgb2YgQ29yZSBEUExMIHBhcmFtIHRhYmxlKi8KKwlkcGxsX3BhcmFtX3AgPSAoZHBsbF9wYXJhbSAqKWdldF9jb3JlX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBhbmQgRVMgcmV2IGJhc2UgKi8KKwlkcGxsX3BhcmFtX3AgPSBkcGxsX3BhcmFtX3AgKyBNQVhfU0lMX0lOREVYKmNsa19pbmRleCArIHNpbF9pbmRleDsKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBzcjMyKENNX0NMS1NFTDJfRU1VKSBzZXQgb3ZlcnJpZGUgdG8gd29yayB3aGVuIGFzbGVlcCAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsJLyogbTN4MiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCAyLCBkcGxsX3BhcmFtX3AtPm0yKTsJLyogU2V0IE0yICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBTZXQgTSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CQkJLyogOTZNIFNyYyAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDgsIDQsIENPUkVfU1NJX0RJVik7CS8qIHNzaSAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDQsIDIsIENPUkVfRlVTQl9ESVYpOwkvKiBmc3VzYiAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDIsIDIsIENPUkVfTDRfRElWKTsJLyogbDQgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAwLCAyLCBDT1JFX0wzX0RJVik7CS8qIGwzICovCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAwLCAzLCBHRlhfRElWKTsJCS8qIGdmeCAqLworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDEsIDIsIFdLVVBfUlNNKTsJCS8qIHJlc2V0IG1nciAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDAsIDMsIFBMTF9MT0NLKTsJCS8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIFBFUiAgRFBMTCBwYXJhbSB0YWJsZSovCisJZHBsbF9wYXJhbV9wID0gKGRwbGxfcGFyYW0gKilnZXRfcGVyX2RwbGxfcGFyYW0oKTsKKwkvKiBNb3ZpbmcgaXQgdG8gdGhlIHJpZ2h0IHN5c2NsayBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgY2xrX2luZGV4OworCS8qIFBFUiBEUExMICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMjQsIDUsIFBFUl9NNlgyKTsJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CS8qIHNldCBNNSAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgMCwgNSwgUEVSX000WDIpOwkvKiBzZXQgTTQgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDUsIFBFUl9NM1gyKTsJLyogc2V0IE0zICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBkcGxsX3BhcmFtX3AtPm0pOwkvKiBzZXQgbSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBuICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDIwLCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOy8qIEZSRVFTRUwgKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQxLCAyLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTVBVIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X21wdV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogTVBVIERQTEwgKHVubG9ja2VkIGFscmVhZHkpICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9NUFUsIDAsIDUsIGRwbGxfcGFyYW1fcC0+bTIpOwkvKiBTZXQgTTIgKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX01QVSwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIFNldCBNICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIFNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCA0LCA0LCBkcGxsX3BhcmFtX3AtPmZzZWwpOwkvKiBGUkVRU0VMICovCisJc3IzMihDTV9DTEtFTl9QTExfTVBVLCAwLCAzLCBQTExfTE9DSyk7IC8qIGxvY2sgbW9kZSAqLworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX1BMTF9NUFUsIExERUxBWSk7CisKKwkvKiBHZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gSVZBIERQTEwgcGFyYW0gdGFibGUqLworCWRwbGxfcGFyYW1fcCA9IChkcGxsX3BhcmFtICopZ2V0X2l2YV9kcGxsX3BhcmFtKCk7CisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJZHBsbF9wYXJhbV9wID0gZHBsbF9wYXJhbV9wICsgTUFYX1NJTF9JTkRFWCpjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisJLyogSVZBIERQTEwgKHNldCB0byAxMioyMD0yNDBNSHopICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgZHBsbF9wYXJhbV9wLT5tMik7CS8qIHNldCBNMiAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTExfSVZBMiwgOCwgMTEsIGRwbGxfcGFyYW1fcC0+bSk7CS8qIHNldCBNICovCisgIAlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIGRwbGxfcGFyYW1fcC0+bik7CS8qIHNldCBOICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgNCwgNCwgZHBsbF9wYXJhbV9wLT5mc2VsKTsJLyogRlJFUVNFTCAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDAsIDMsIFBMTF9MT0NLKTsJLyogbG9jayBtb2RlICovCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBTZXQgdXAgR1BUaW1lcnMgdG8gc3lzX2NsayBzb3VyY2Ugb25seSAqLworIAlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDgsIDB4ZmYpOworCXNyMzIoQ01fQ0xLU0VMX1dLVVAsIDAsIDEsIDEpOworCisJZGVsYXkoNTAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogc2VjdXJlX3VubG9jaworICogRGVzY3JpcHRpb246IFNldHVwIHNlY3VyaXR5IHJlZ2lzdGVycyBmb3IgYWNjZXNzCisgKiAoR1AgRGV2aWNlIG9ubHkpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNlY3VyZV91bmxvY2sodm9pZCkKK3sKKwkvKiBQZXJtaXNzaW9uIHZhbHVlcyBmb3IgcmVnaXN0ZXJzIC1GdWxsIGZsZWRnZWQgcGVybWlzc2lvbnMgdG8gYWxsICovCisJI2RlZmluZSBVTkxPQ0tfMSAweEZGRkZGRkZGCisJI2RlZmluZSBVTkxPQ0tfMiAweDAwMDAwMDAwCisJI2RlZmluZSBVTkxPQ0tfMyAweDAwMDBGRkZGCisJLyogUHJvdGVjdGlvbiBNb2R1bGUgUmVnaXN0ZXIgVGFyZ2V0IEFQRSAoUE1fUlQpKi8KKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMSk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18xLCBSVF9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgUlRfQUREUl9NQVRDSF8xKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgR1BNQ19SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIE9DTV9XUklURV9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMiwgT0NNX0FERFJfTUFUQ0hfMik7CisKKwkvKiBJVkEgQ2hhbmdlcyAqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgSVZBMl9SRUFEX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMCk7CisKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFNNU19SR19BVFQwKTsgLyogU0RSQyByZWdpb24gMCBwdWJsaWMgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHRyeV91bmxvY2tfc3JhbSgpCisgKiBEZXNjcmlwdGlvbjogSWYgY2hpcCBpcyBHUCB0eXBlLCB1bmxvY2sgdGhlIFNSQU0gZm9yCisgKiAgZ2VuZXJhbCB1c2UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHRyeV91bmxvY2tfbWVtb3J5KHZvaWQpCit7CisJaW50IG1vZGU7CisKKwkvKiBpZiBHUCBkZXZpY2UgdW5sb2NrIGRldmljZSBTUkFNIGZvciBnZW5lcmFsIHVzZSAqLworCS8qIHNlY3VyZSBjb2RlIGJyZWFrcyBmb3IgU2VjdXJlL0VtdWxhdGlvbiBkZXZpY2UgLSBIUy9FL1QqLworCW1vZGUgPSBnZXRfZGV2aWNlX3R5cGUoKTsKKwlpZiAobW9kZSA9PSBHUF9ERVZJQ0UpIHsKKwkJc2VjdXJlX3VubG9jaygpOworCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzX2luaXQKKyAqIERlc2NyaXB0aW9uOiBEb2VzIGVhcmx5IHN5c3RlbSBpbml0IG9mIG11eGluZyBhbmQgY2xvY2tzLgorICogLSBDYWxsZWQgYXQgdGltZSB3aGVuIG9ubHkgc3RhY2sgaXMgYXZhaWxhYmxlLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgc19pbml0KHZvaWQpCit7CisJd2F0Y2hkb2dfaW5pdCgpOworI2lmZGVmIENPTkZJR18zNDMwX0FTXzM0MTAKKwkvKiBzZXR1cCB0aGUgc2NhbGFiaWxpdHkgY29udHJvbCByZWdpc3RlciBmb3IgCisJICogMzQzMCB0byB3b3JrIGluIDM0MTAgbW9kZQorCSAqLworCV9fcmF3X3dyaXRlbCgweDVBQkYsQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX09DUCk7CisjZW5kaWYKKwl0cnlfdW5sb2NrX21lbW9yeSgpOworCXNldF9tdXhjb25mX3JlZ3MoKTsKKwlkZWxheSgxMDApOworCXByY21faW5pdCgpOworCXBlcl9jbG9ja3NfZW5hYmxlKCk7CisJY29uZmlnXzM0MzBzZHJhbV9kZHIoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG1pc2NfaW5pdF9yCisgKiBEZXNjcmlwdGlvbjogSW5pdCBldGhlcm5ldCAoZG9uZSBoZXJlIHNvIHVkZWxheSB3b3JrcykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtaXNjX2luaXRfciAodm9pZCkKK3sKKwlyZXR1cm4oMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUKKyAqIERlc2NyaXB0aW9uOiBXYWl0IGZvciBwb3N0aW5nIHRvIGZpbmlzaCBvbiB3YXRjaGRvZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZSh1bnNpZ25lZCBpbnQgd2RfYmFzZSkKK3sKKwlpbnQgcGVuZGluZyA9IDE7CisJZG8geworCQlwZW5kaW5nID0gX19yYXdfcmVhZGwod2RfYmFzZSArIFdXUFMpOworCX0gd2hpbGUgKHBlbmRpbmcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogd2F0Y2hkb2dfaW5pdAorICogRGVzY3JpcHRpb246IFNodXQgZG93biB3YXRjaCBkb2dzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhdGNoZG9nX2luaXQodm9pZCkKK3sKKwkvKiBUaGVyZSBhcmUgMyB3YXRjaCBkb2dzIFdEMT1TZWN1cmUsIFdEMj1NUFUsIFdEMz1JVkEuIFdEMSBpcworCSAqIGVpdGhlciB0YWtlbiBjYXJlIG9mIGJ5IFJPTSAoSFMvRU1VKSBvciBub3QgYWNjZXNzaWJsZSAoR1ApLgorCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIFdEMi1NUFUgb3IgdGFrZSBhIFBSQ00gcmVzZXQuICBXRDMKKwkgKiBzaG91bGQgbm90IGJlIHJ1bm5pbmcgYW5kIGRvZXMgbm90IGdlbmVyYXRlIGEgUFJDTSByZXNldC4KKwkgKi8KKwlzcjMyKENNX0ZDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwlzcjMyKENNX0lDTEtFTl9XS1VQLCA1LCAxLCAxKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDUsIDB4MjAsIENNX0lETEVTVF9XS1VQLCA1KTsgLyogc29tZSBpc3N1ZSBoZXJlICovCisKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMSwgV0QyX0JBU0UgKyBXU1BSKTsKKwl3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlKFdEMl9CQVNFKTsKKwlfX3Jhd193cml0ZWwoV0RfVU5MT0NLMiwgV0QyX0JBU0UgKyBXU1BSKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRyYW1faW5pdAorICogRGVzY3JpcHRpb246IHNldHMgdWJvb3RzIGlkZWEgb2Ygc2RyYW0gc2l6ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZHJhbV9pbml0ICh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHBlcmlwaGVyYWxfZW5hYmxlCisgKiBEZXNjcmlwdGlvbjogRW5hYmxlIHRoZSBjbGtzICYgcG93ZXIgZm9yIHBlcmlmcyAoR1BUMiwgVUFSVDEsLi4uKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCkKK3sKKwkvKiBFbmFibGUgR1AyIHRpbWVyLiAqLworCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgMSwgMHgxKTsgLyogR1BUMiA9IHN5cyBjbGsgKi8KKwlzcjMyKENNX0lDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIElDS2VuIEdQVDIgKi8KKwlzcjMyKENNX0ZDTEtFTl9QRVIsIDMsIDEsIDB4MSk7IC8qIEZDS2VuIEdQVDIgKi8KKworI2lmZGVmIENGR19OUzE2NTUwCisJLyogRW5hYmxlIFVBUlQxIGNsb2NrcyAqLworCXNyMzIoQ01fRkNMS0VOMV9DT1JFLCAxMywgMSwgMHgxKTsKKwlzcjMyKENNX0lDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisjZW5kaWYKKwlkZWxheSgxMDAwKTsKK30KKworLyogU2V0IE1VWCBmb3IgVUFSVCwgR1BNQywgU0RSQywgR1BJTyAqLworCisjZGVmaW5lIAlNVVhfVkFMKE9GRlNFVCxWQUxVRSlcCisJCV9fcmF3X3dyaXRldygoVkFMVUUpLCBPTUFQMzRYWF9DVFJMX0JBU0UgKyAoT0ZGU0VUKSk7CisKKyNkZWZpbmUJCUNQKHgpCShDT05UUk9MX1BBRENPTkZfIyN4KQorLyoKKyAqIElFTiAgLSBJbnB1dCBFbmFibGUKKyAqIElESVMgLSBJbnB1dCBEaXNhYmxlCisgKiBQVEQgIC0gUHVsbCB0eXBlIERvd24KKyAqIFBUVSAgLSBQdWxsIHR5cGUgVXAKKyAqIERJUyAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGluYWN0aXZlCisgKiBFTiAgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBhY3RpdmUKKyAqIE0wICAgLSBNb2RlIDAKKyAqIFRoZSBjb21tZW50ZWQgc3RyaW5nIGdpdmVzIHRoZSBmaW5hbCBtdXggY29uZmlndXJhdGlvbiBmb3IgdGhhdCBwaW4KKyAqLworI2RlZmluZSBNVVhfREVGQVVMVCgpXAorCU1VWF9WQUwoQ1AoU0RSQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzKi9cCisJTVVYX1ZBTChDUChTRFJDX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDQqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENSovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDcqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDExKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDEzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QxOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDE5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIyKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIzKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI1Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI2Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyNyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI4Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QyOSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDI5Ki9cCisJTVVYX1ZBTChDUChTRFJDX0QzMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMwKi9cCisJTVVYX1ZBTChDUChTRFJDX0QzMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0NMSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfQ0xLKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzEqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMyKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExKi9cCisJTVVYX1ZBTChDUChHUE1DX0EyKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTIqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTMpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E1KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTUqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTYpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNyksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E4KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTgqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTkpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMTApLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0ExMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QzKi9cCisJTVVYX1ZBTChDUChHUE1DX0Q0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDQqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENSovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q2Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q3KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDcqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDgpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EOSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q5Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxMCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEwKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDExKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMiksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEyKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxMyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDEzKi9cCisJTVVYX1ZBTChDUChHUE1DX0QxNCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0QxNSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDE1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzApLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MxKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMiksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MyKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzMpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M0KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzQqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M1Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzYpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M3KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzcqL1wKKwlNVVhfVkFMKENQKEdQTUNfQ0xLKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19DTEsqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkFEVl9BTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQURWX0FMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OT0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05PRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OV0UpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05XRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUwX0NMRSksICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX05CRTBfQ0xFKi9cCisJTVVYX1ZBTChDUChHUE1DX05CRTEpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNjEqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldQKSwgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV1AqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDApLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMSksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX1dBSVQxKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQyKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjQqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDMpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT182NSovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg4Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTE5KSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fODkqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjApLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEEyMSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzkxKi9cCisJTVVYX1ZBTChDUChDQU1fV0VOKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTY3Ki9cCisJTVVYX1ZBTChDUChVQVJUMV9UWCksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1RYKi9cCisJTVVYX1ZBTChDUChVQVJUMV9SVFMpLCAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfQ1RTKSwgICAgICAoSUVOIHwgUFRVIHwgRElTIHwgTTApKSAvKlVBUlQxX0NUUyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlgpLCAgICAgICAoSUVOIHwgUFREIHwgRElTIHwgTTApKSAvKlVBUlQxX1JYKi9cCisJTVVYX1ZBTChDUChNQ0JTUDFfRFgpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTU4Ki9cCisJTVVYX1ZBTChDUChTWVNfMzJLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNZU18zMksqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzMgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNCAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMyksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT181ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q0KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDUpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNyAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNiksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184ICovXAorCU1VWF9WQUwoQ1AoU1lTX0NMS09VVDIpLCAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzE4NiovXAorCU1VWF9WQUwoQ1AoSlRBR19uVFJTVCksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX25UUlNUKi9cCisJTVVYX1ZBTChDUChKVEFHX1RDSyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVENLKi9cCisJTVVYX1ZBTChDUChKVEFHX1RNUyksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVE1TKi9cCisJTVVYX1ZBTChDUChKVEFHX1RESSksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfVERJKi9cCisJTVVYX1ZBTChDUChKVEFHX0VNVTApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkpUQUdfRU1VMCovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUxKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTEqL1wKKwlNVVhfVkFMKENQKEVUS19DTEspLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMiovXAorCU1VWF9WQUwoQ1AoRVRLX0NUTCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzEzKi9cCisJTVVYX1ZBTChDUChFVEtfRDAgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTQqL1wKKwlNVVhfVkFMKENQKEVUS19EMSApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QyICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEwKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjQqL1wKKwlNVVhfVkFMKENQKEVUS19EMTEpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNSovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI2Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEzKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjcqL1wKKwlNVVhfVkFMKENQKEVUS19EMTQpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOCovXAorCU1VWF9WQUwoQ1AoRVRLX0QxNSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI5Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNldF9tdXhjb25mX3JlZ3MKKyAqIERlc2NyaXB0aW9uOiBTZXR0aW5nIHVwIHRoZSBjb25maWd1cmF0aW9uIE11eCByZWdpc3RlcnMKKyAqICAgICAgICAgICAgICBzcGVjaWZpYyB0byB0aGUgaGFyZHdhcmUuIE1hbnkgcGlucyBuZWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQgZnJvbSBwcm90ZWN0IHRvIHByaW1hcnkgbW9kZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNldF9tdXhjb25mX3JlZ3Modm9pZCkKK3sKKwlNVVhfREVGQVVMVCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogbmFuZCtfaW5pdAorICogRGVzY3JpcHRpb246IFNldCB1cCBuYW5kIGZvciBuYW5kIGFuZCBqZmZzMiBjb21tYW5kcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisjaWZkZWYgQ0ZHX05BTkQKKwlfX3Jhd193cml0ZWwoMHgwMDEsIEdQTUNfQ09ORklHKTsJLyogc2V0IG5XUCwgZGlzYWJsZSBsaW1pdGVkIGFkZHIgKi8KKyNlbmRpZgorCisJLyogU2V0IHRoZSBHUE1DIFZhbHMgLiBGb3IgTkFORCBib290IG9uIDM0MzBTRFAsIE5BTkQgaXMgbWFwcGVkIGF0IENTMAorICAgICAgICAgKiAgLCBOT1IgYXQgQ1MxIGFuZCBNUERCIGF0IENTMy4gQW5kIG9uZU5BTkQgYm9vdCwgd2UgbWFwIG9uZU5BTkQgYXQgQ1MwLgorCSAqICBXZSBjb25maWd1cmUgb25seSBHUE1DIENTMCB3aXRoIHJlcXVpcmVkIHZhbHVlcy4gQ29uZmlnaXJpbmcgb3RoZXIgZGV2aWNlcworCSAqICBhdCBvdGhlciBDUyBpbiBkb25lIGluIHUtYm9vdCBhbnl3YXkuIFNvIHdlIGRvbid0IGhhdmUgdG8gYm90aGVyIGRvaW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCV9fcmF3X3dyaXRlbCgwICwgR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlkZWxheSgxMDAwKTsKKworI2lmZGVmIENGR19OQU5ECisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHMiwgR1BNQ19DT05GSUcyICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBTTU5BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggU01OQU5EX0dQTUNfQ09ORklHNSwgR1BNQ19DT05GSUc1ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIFNNTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisKKyNlbHNlIC8qIENGR19PTkVOQU5EICovCisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMSwgR1BNQ19DT05GSUcxICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzMsIEdQTUNfQ09ORklHMyArIEdQTUNfQ09ORklHX0NTMCk7CisJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNCwgR1BNQ19DT05GSUc0ICsgR1BNQ19DT05GSUdfQ1MwKTsKKwlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzYsIEdQTUNfQ09ORklHNiArIEdQTUNfQ09ORklHX0NTMCk7CisjZW5kaWYKKworCS8qIEVuYWJsZSB0aGUgR1BNQyBNYXBwaW5nICovCisJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorCQkgICAgICgoT01BUDM0WFhfR1BNQ19DUzBfTUFQPj4yNCkgJiAweDNGKSB8CisJCSAgICAgKDE8PDYpICksICAoR1BNQ19DT05GSUc3ICsgR1BNQ19DT05GSUdfQ1MwKSk7CisJZGVsYXkoMjAwMCk7CisjaWYgZGVmaW5lZChDRkdfTkFORCkKKyAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiVW5zdXBwb3J0ZWQgQ2hpcCFcbiIpOworI2VuZGlmCisJCXJldHVybiAxOworCX0KKyNlbGlmIGRlZmluZWQoQ0ZHX09ORU5BTkQpCisJaWYgKG9uZW5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisJCXByaW50ZigiT25lTkFORCBVbnN1cHBvcnRlZCAhXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENGR19DTURfRkFUCit0eXBlZGVmIGludCAobW1jX2Jvb3RfYWRkcikgKHZvaWQpOworaW50IG1tY19ib290KHZvaWQpCit7CisgICAgICAgbG9uZyBzaXplLCBpOworICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gQ0ZHX0xPQURBRERSOworICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7CisgICAgICAgY2hhciBidWZbMTJdOworICAgICAgIGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjID0gTlVMTDsKKyAgICAgICBpbnQgZGV2ID0gMDsKKyAgICAgICBpbnQgcGFydCA9IDE7CisgICAgICAgY2hhciAqZXA7CisgICAgICAgdW5zaWduZWQgY2hhciByZXQgPSAwOworCisgICAgICAgcHJpbnRmKCJTdGFydGluZyBYLWxvYWRlciBvbiBNTUMgXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkIFxuIik7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisKKyAgICAgICBkZXZfZGVzYyA9IG1tY19nZXRfZGV2KDApOworICAgICAgIGZhdF9yZWdpc3Rlcl9kZXZpY2UoZGV2X2Rlc2MsIDEpOworICAgICAgIHNpemUgPSBmaWxlX2ZhdF9yZWFkKCJ1LWJvb3QuYmluIiwgKHVuc2lnbmVkIGNoYXIgKilvZmZzZXQsIDApOworICAgICAgIGlmIChzaXplID09IC0xKSB7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJcbiVsZCBCeXRlcyBSZWFkIGZyb20gTU1DIFxuIiwgc2l6ZSk7CisKKyAgICAgICBwcmludGYoIlN0YXJ0aW5nIE9TIEJvb3Rsb2FkZXIgZnJvbSBNTUMuLi5cbiIpOworCisgICAgICAgKChtbWNfYm9vdF9hZGRyICopIENGR19MT0FEQUREUikgKCk7CisKKyAgICAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBvcHRpb25hbGx5IGRvIHNvbWV0aGluZyBsaWtlIGJsaW5raW5nIExFRCAqLwordm9pZCBib2FyZF9oYW5nICh2b2lkKQoreyB3aGlsZSAoMCkge307fQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAvcGxhdGZvcm0uUyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3BsYXRmb3JtLlMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBCb2FyZCBzcGVjaWZpYyBzZXR1cCBpbmZvCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY2xvY2tzLmg+CisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCS8qIHNkcmFtIGxvYWQgYWRkciBmcm9tIGNvbmZpZy5tayAqLworCisjaWYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkgJiYgIWRlZmluZWQoQ0ZHX05BTkRfQk9PVCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY3B5X2Nsa19jb2RlOiByZWxvY2F0ZXMgY2xvY2sgY29kZSBpbnRvIFNSQU0gd2hlcmUgaXRzIHNhZmVyIHRvIGV4ZWN1dGUKKyAqIFIxID0gU1JBTSBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisuZ2xvYmFsIGNweV9jbGtfY29kZQorIGNweV9jbGtfY29kZToKKyAgICAgICAgLyogQ29weSBEUExMIGNvZGUgaW50byBTUkFNICovIAorICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIE5PVEU6IDM0MzAgWC1sb2FkZXIgY3VycmVudGx5IGRvZXMgbm90IHVzZSB0aGlzIGNvZGUuICAKKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCisuZ2xvYmFsIGdvX3RvX3NwZWVkCisgZ29fdG9fc3BlZWQ6CisgICAgICAgIHN0bWZkIHNwISwge3I0LXI2fQorCisgICAgICAgIC8qIG1vdmUgaW50byBmYXN0IHJlbG9jayBieXBhc3MgKi8KKyAgICAgICAgbGRyICAgICByNCwgcGxsX2N0bF9hZGQKKyAgICAgICAgc3RyICAgICByMCwgW3I0XQord2FpdDE6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJlcSAgICAgd2FpdDEgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworCisJLyogc2V0IG5ldyBkcGxsIGRpdmlkZXJzIF9hZnRlcl8gaW4gYnlwYXNzICovCisJbGRyICAgICByNSwgcGxsX2Rpdl9hZGQxCisgICAgICAgIHN0ciAgICAgcjEsIFtyNV0gICAgICAgICAgLyogc2V0IG0sIG4sIG0yICovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMgorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgIC8qIHNldCBsMy9sNC8uLiBkaXZpZGVycyovCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkMyAgLyogd2t1cCAqLworICAgICAgICBsZHIgICAgIHIyLCBwbGxfZGl2X3ZhbDMgIC8qIHJzbSB2YWwgKi8KKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgICAgICAKKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQ0ICAvKiBnZnggKi8KKyAgICAgICAgbGRyICAgICByMiwgcGxsX2Rpdl92YWw0IAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdICAgICAgICAgCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNSAKKyAgICAgICAgc3RyICAgICByMiwgW3I1XSAgICAgCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8gICAgIAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdICAgICAgIC8qIGxvY2sgKi8KKyAgICAgICAgbm9wICAgICAgICAgICAgICAgICAgICAvKiBBUk0gc2xvdyBhdCB0aGlzIHBvaW50IHdvcmtpbmcgYXQgc3lzX2NsayAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAord2FpdDI6CisgICAgICAgIGxkciAgICAgcjUsIFtyM10gICAgICAgLyogZ2V0IHN0YXR1cyAqLworICAgICAgICBhbmQgICAgIHI1LCByNSwgIzB4MSAgIC8qIGlzb2xhdGUgY29yZSBzdGF0dXMgKi8KKyAgICAgICAgY21wICAgICByNSwgIzB4MSAgICAgICAvKiBzdGlsbCBsb2NrZWQ/ICovCisgICAgICAgIGJuZSAgICAgd2FpdDIgICAgICAgICAgLyogaWYgbG9jaywgbG9vcCAqLworICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbGRtZmQgc3AhLCB7cjQtcjZ9CisgICAgICAgIG1vdiAgICAgcGMsIGxyICAgICAgICAgICAvKiBiYWNrIHRvIGNhbGxlciwgbG9ja2VkICovICAgICAgICAKKworX2dvX3RvX3NwZWVkOiAud29yZCBnb190b19zcGVlZAorCisvKiB0aGVzZSBjb25zdGFudHMgbmVlZCB0byBiZSBjbG9zZSBmb3IgUElDIGNvZGUgKi8KKy8qIFRoZSBOb3IgaGFzIHRvIGJlIGluIHRoZSBGbGFzaCBCYXNlIENTMCBmb3IgdGhpcyBjb25kaXRpb24gdG8gaGFwcGVuICovCitmbGFzaF9jZmcxX2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMSkKK2ZsYXNoX2NmZzNfYWRkcjoKKyAgICAud29yZCAgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHMykKK2ZsYXNoX2NmZzNfdmFsOiAKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUczCitmbGFzaF9jZmc0X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNCkKK2ZsYXNoX2NmZzRfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzQKK2ZsYXNoX2NmZzVfdmFsOgorICAgIC53b3JkICBTVE5PUl9HUE1DX0NPTkZJRzUKK2ZsYXNoX2NmZzVfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUc1KQorcGxsX2N0bF9hZGQ6CisgICAgLndvcmQgQ01fQ0xLRU5fUExMCitwbGxfZGl2X2FkZDE6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9QTEwgCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKSAKK3BsbF9kaXZfYWRkNDoKKyAgICAud29yZCBDTV9DTEtTRUxfR0ZYCitwbGxfZGl2X3ZhbDQ6CisgICAgLndvcmQgKEdGWF9ESVYgPDwgMCkgCitwbGxfZGl2X2FkZDU6CisgICAgLndvcmQgQ01fQ0xLU0VMMV9FTVUKK3BsbF9kaXZfdmFsNToKKyAgICAud29yZCBDTFNFTDFfRU1VX1ZBTAorCisjZW5kaWYKKworLmdsb2JsIGxvd2xldmVsX2luaXQKK2xvd2xldmVsX2luaXQ6CisJbGRyCXNwLAlTUkFNX1NUQUNLCisgICAgICAgIHN0ciAgICAgaXAsCVtzcF0gICAgLyogc3Rhc2ggb2xkIGxpbmsgcmVnaXN0ZXIgKi8KKwltb3YJaXAsCWxyCS8qIHNhdmUgbGluayByZWcgYWNyb3NzIGNhbGwgKi8KKwlibCAgICAgIHNfaW5pdCAgICAgICAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworICAgICAgICBsZHIgICAgIGlwLAlbc3BdICAgIC8qIHJlc3RvcmUgc2F2ZSBpcCAqLworCW1vdglsciwJaXAJLyogcmVzdG9yZSBsaW5rIHJlZyAqLworCisJLyogYmFjayB0byBhcmNoIGNhbGxpbmcgY29kZSAqLworCW1vdglwYywJbHIKKworCS8qIHRoZSBsaXRlcmFsIHBvb2xzIG9yaWdpbiAqLworCS5sdG9yZworCitSRUdfQ09OVFJPTF9TVEFUVVM6CisJLndvcmQgQ09OVFJPTF9TVEFUVVMKK1NSQU1fU1RBQ0s6CisJLndvcmQgTE9XX0xFVkVMX1NSQU1fU1RBQ0sKKworLyogRFBMTCgxLTQpIFBBUkFNIFRBQkxFUyAqLworLyogRWFjaCBvZiB0aGUgdGFibGVzIGhhcyBNLCBOLCBGUkVRU0VMLCBNMiB2YWx1ZXMgZGVmaW5lZCBmb3Igbm9taW5hbAorICogT1BQICgxLjJWKS4gVGhlIGZpZWxkcyBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gZHBsbF9wYXJhbSBzdHJ1Y3QoY2xvY2suYykuIAorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUsMHgwNywweDA1LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTdELDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MUY0LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorIAorLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OSwweDEyLDB4MDQsMHgwMQorLyogRVMyICovCisud29yZCAweDI3MSwweDE3LDB4MDMsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgxNywweDAzLDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QsMHgxOSwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEsMHgwQywweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MEMsMHgwNywweDAxCisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxRkEsMHgzMiwweDAzLDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgyNzEsMHgyRiwweDAzLDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MTRDLDB4MkYsMHgwMywweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QsMHgwNSwweDA3LDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQsMHgwNSwweDA3LDB4MDEKKy8qIDM0MTAgKi8KKy53b3JkIDB4MDg1LDB4MDUsMHgwNywweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MEZBLDB4MEMsMHgwMywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTY4LDB4MEMsMHgwMywweDAxCisvKiAzNDEwICovCisud29yZCAweDEwQSwweDBDLDB4MDMsMHgwMQorCisvKiAxOS4yTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MDgyLDB4MDksMHgwNywweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxLDB4MEIsMHgwNiwweDAxCisvKiAzNDEwICovCisud29yZCAweDE0QywweDE3LDB4MDMsMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RCwweDBDLDB4MDcsMHgwMQorLyogRVMyICovCisud29yZCAweDBCNCwweDBDLDB4MDcsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgwODUsMHgwQywweDA3LDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDEzRiwweDMwLDB4MDMsMHgwMQorLyogRVMyICovCisud29yZCAweDBFMSwweDE3LDB4MDYsMHgwMQorLyogMzQxMCAqLworLndvcmQgMHgxNEMsMHgyRiwweDAzLDB4MDEKKworCisuZ2xvYmwgZ2V0X2l2YV9kcGxsX3BhcmFtCitnZXRfaXZhX2RwbGxfcGFyYW06CisJYWRyIHIwLCBpdmFfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogQ29yZSBEUExMIHRhcmdldHMgZm9yIEwzIGF0IDE2NiAmIEwxMzMgKi8KK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIE1fMTJfRVMxLE1fMTJfRVMxLEZTTF8xMl9FUzEsTTJfMTJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTIsTl8xMixGU0VMXzEyLE0yXzEyCisvKiAzNDEwICovCisud29yZCBNXzEyLE5fMTIsRlNFTF8xMixNMl8xMgorCisvKiAxM01IeiAqLworLyogRVMxICovCisud29yZCBNXzEzX0VTMSxOXzEzX0VTMSxGU0xfMTNfRVMxLE0yXzEzX0VTMQorLyogRVMyICovCisud29yZCBNXzEzLE5fMTMsRlNFTF8xMyxNMl8xMworLyogMzQxMCAqLworLndvcmQgTV8xMyxOXzEzLEZTRUxfMTMsTTJfMTMKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCBNXzE5cDJfRVMxLE5fMTlwMl9FUzEsRlNMXzE5cDJfRVMxLE0yXzE5cDJfRVMxCisvKiBFUzIgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKy8qIDM0MTAgKi8KKy53b3JkIE1fMTlwMixOXzE5cDIsRlNFTF8xOXAyLE0yXzE5cDIKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8yNl9FUzEsTl8yNl9FUzEsRlNMXzI2X0VTMSxNMl8yNl9FUzEKKy8qIEVTMiAqLworLndvcmQgTV8yNixOXzI2LEZTRUxfMjYsTTJfMjYKKy8qIDM0MTAgKi8KKy53b3JkIE1fMjYsTl8yNixGU0VMXzI2LE0yXzI2CisKKy8qIDM4LjRNSHogKi8KKy8qIEVTMSAqLworLndvcmQgTV8zOHA0X0VTMSxOXzM4cDRfRVMxLEZTTF8zOHA0X0VTMSxNMl8zOHA0X0VTMQorLyogRVMyICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisvKiAzNDEwICovCisud29yZCBNXzM4cDQsTl8zOHA0LEZTRUxfMzhwNCxNMl8zOHA0CisKKy5nbG9ibCBnZXRfY29yZV9kcGxsX3BhcmFtCitnZXRfY29yZV9kcGxsX3BhcmFtOgorCWFkciByMCwgY29yZV9kcGxsX3BhcmFtCisJbW92IHBjLCBscgorCisvKiBQRVIgRFBMTCB2YWx1ZXMgYXJlIHNhbWUgZm9yIGJvdGggRVMxIGFuZCBFUzIgKi8KK3Blcl9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy53b3JkIDB4RDgsMHgwNSwweDA3LDB4MDkKKworLyogMTNNSHogKi8KKy53b3JkIDB4MUIwLDB4MEMsMHgwMywweDA5CisKKy8qIDE5LjJNSHogKi8KKy53b3JkIDB4RTEsMHgwOSwweDA3LDB4MDkKKworLyogMjZNSHogKi8KKy53b3JkIDB4RDgsMHgwQywweDA3LDB4MDkKKworLyogMzguNE1IeiAqLworLndvcmQgMHhFMSwweDEzLDB4MDcsMHgwOQorCisuZ2xvYmwgZ2V0X3Blcl9kcGxsX3BhcmFtCitnZXRfcGVyX2RwbGxfcGFyYW06CisJYWRyIHIwLCBwZXJfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDM0MzBzZHAveC1sb2FkLmxkcyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwMmY3NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzNDMwc2RwL3gtbG9hZC5sZHMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE5vdmVtYmVyIDIwMDYgLSBDaGFuZ2VkIHRvIHN1cHBvcnQgMzQzMHNkcCBkZXZpY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cyAKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCitPVVRQVVRfRk9STUFUKCJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIiwgImVsZjMyLWxpdHRsZWFybSIpCitPVVRQVVRfQVJDSChhcm0pCitFTlRSWShfc3RhcnQpCitTRUNUSU9OUworeworCS4gPSAweDAwMDAwMDAwOworCisJLiA9IEFMSUdOKDQpOworCS50ZXh0ICAgICAgOgorCXsKKwkgIGNwdS9vbWFwMy9zdGFydC5vCSgudGV4dCkKKwkgICooLnRleHQpCisJfQorCisJLiA9IEFMSUdOKDQpOworCS5yb2RhdGEgOiB7ICooLnJvZGF0YSkgfQorCisJLiA9IEFMSUdOKDQpOworCS5kYXRhIDogeyAqKC5kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmdvdCA6IHsgKiguZ290KSB9CisKKwkuID0gQUxJR04oNCk7CisJX19ic3Nfc3RhcnQgPSAuOworCS5ic3MgOiB7ICooLmJzcykgfQorCV9lbmQgPSAuOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vTWFrZWZpbGUgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMzk5YzViCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vTWFrZWZpbGUKQEAgLTAsMCArMSw0NyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEsIDIwMDIKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQk9BUkQpLmEKKworT0JKUwk6PSBvbWFwM2V2bS5vIAorU09CSlMJOj0gcGxhdGZvcm0ubworCiskKExJQik6CSQoT0JKUykgJChTT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICReCisKK2NsZWFuOgorCXJtIC1mICQoU09CSlMpICQoT0JKUykKKworZGlzdGNsZWFuOgljbGVhbgorCXJtIC1mICQoTElCKSBjb3JlICouYmFrICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL2NvbmZpZy5tayBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNDVlYzIyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vY29uZmlnLm1rCkBAIC0wLDAgKzEsMTkgQEAKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyMKKyMgT01BUDNFVk0gYm9hcmQgdXNlcyBPTUFQMzQzMCAoQVJNLUNvcnRleEE4KSBjcHUKKyMgc2VlIGh0dHA6Ly93d3cudGkuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUZXhhcyBJbnN0cnVtZW50cyMKKyMKKyMgT01BUDNFVk0gaGFzIDEgYmFuayBvZiAxMjhNQiBtUE9QLVNEUkFNIG9uIENTMAorIyBQaHlzaWNhbCBBZGRyZXNzOgorIyA4MDAwJzAwMDAgKGJhbmswKQorCisjIEZvciB1c2UgaWYgeW91IHdhbnQgWC1Mb2FkZXIgdG8gcmVsb2NhdGUgZnJvbSBTUkFNIHRvIEREUgorI1RFWFRfQkFTRSA9IDB4ODBlODAwMDAKKworIyBGb3IgWElQIGluIDY0SyBvZiBTUkFNIG9yIGRlYnVnIChHUCBkZXZpY2UgaGFzIGl0IGFsbCBhdmFpbGFiZSkKKyMgU1JBTSA0MDIwMDAwMC00MDIwRkZGRiBiYXNlCisjIGluaXRpYWwgc3RhY2sgYXQgMHg0MDIwZmZmYyB1c2VkIGluIHNfaW5pdCAoYmVsb3cgeGxvYWRlcikuCisjIFRoZSBydW4gdGltZSBzdGFjayBpcyAoYWJvdmUgeGxvYWRlciwgMmsgYmVsb3cpCisjIElmIGFueSBnbG9iYWxzIGV4aXN0IHRoZXJlIG5lZWRzIHRvIGJlIHJvb20gZm9yIHRoZW0gYWxzbworVEVYVF9CQVNFID0gMHg0MDIwMDgwMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvYm9hcmQvb21hcDNldm0vb21hcDNldm0uYyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWQ3Yjk5NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL29tYXAzZXZtLmMKQEAgLTAsMCArMSwxMjM5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyogVXNlZCB0byBpbmRleCBpbnRvIERQTEwgcGFyYW1ldGVyIHRhYmxlcyAqLworc3RydWN0IGRwbGxfcGFyYW0geworICAgICAgICB1bnNpZ25lZCBpbnQgbTsKKyAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgIHVuc2lnbmVkIGludCBmc2VsOworICAgICAgICB1bnNpZ25lZCBpbnQgbTI7Cit9OworCitzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgc3lzX2NsazsKKwl1bnNpZ25lZCBpbnQgbTsKKwl1bnNpZ25lZCBpbnQgbjsKKwl1bnNpZ25lZCBpbnQgbTI7CisJdW5zaWduZWQgaW50IG0zOworCXVuc2lnbmVkIGludCBtNDsKKwl1bnNpZ25lZCBpbnQgbTU7CisJdW5zaWduZWQgaW50IG02OworCXVuc2lnbmVkIGludCBtMmRpdjsKK307CisKK3R5cGVkZWYgc3RydWN0IGRwbGxfcGFyYW0gZHBsbF9wYXJhbTsKKworI2RlZmluZSBNQVhfU0lMX0lOREVYCTMKKworLyogRm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsb3dsZXZlbF9pbml0LlMgKi8KK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfbXB1X2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF9jb3JlX2RwbGxfcGFyYW0odm9pZCk7CitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0X3Blcl9kcGxsX3BhcmFtKHZvaWQpOworCitleHRlcm4gZHBsbF9wYXJhbSAqZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbSh2b2lkKTsKK2V4dGVybiBkcGxsX3BhcmFtICpnZXRfMzZ4X2l2YV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfY29yZV9kcGxsX3BhcmFtKHZvaWQpOworZXh0ZXJuIGRwbGxfcGFyYW0gKmdldF8zNnhfcGVyX2RwbGxfcGFyYW0odm9pZCk7CisKK2V4dGVybiBpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworZXh0ZXJuIGJsb2NrX2Rldl9kZXNjX3QgKm1tY19nZXRfZGV2KGludCBkZXYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworCV9fYXNtX18gdm9sYXRpbGUgKCIxOlxuIiAic3VicyAlMCwgJTEsICMxXG4iCisJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIobG9vcHMpKTsKK30KKwordm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlY3MpIHsKKwlkZWxheSh1c2Vjcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogYm9hcmRfaW5pdAorICogRGVzY3JpcHRpb246IEVhcmx5IGhhcmR3YXJlIGluaXQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYm9hcmRfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBnZXRfZGV2aWNlX3R5cGUoKTogdGVsbCBpZiBHUC9IUy9FTVUvVFNUCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfZGV2aWNlX3R5cGUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoREVWSUNFX01BU0spOworICAgICAgICByZXR1cm4obW9kZSA+Pj0gOCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNib290X3ZhbHVlKHZvaWQpIC0gcmV0dXJuIFNZU19CT09UWzQ6MF0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X3N5c2Jvb3RfdmFsdWUodm9pZCkKK3sKKyAgICAgICAgaW50IG1vZGU7CisgICAgICAgIG1vZGUgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NUQVRVUykgJiAoU1lTQk9PVF9NQVNLKTsKKyAgICAgICAgcmV0dXJuIG1vZGU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZ2V0X21lbV90eXBlKHZvaWQpIC0gcmV0dXJucyB0aGUga2luZCBvZiBtZW1vcnkgY29ubmVjdGVkCisgKiB0byBHUE1DIHRoYXQgd2UgYXJlIHRyeWluZyB0byBib290IGZvcm0uIFVzZXMgU1lTIEJPT1Qgc2V0dGluZ3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfbWVtX3R5cGUodm9pZCkKK3sKKyAgICAgICAgdTMyICAgbWVtX3R5cGUgPSBnZXRfc3lzYm9vdF92YWx1ZSgpOworICAgICAgICBzd2l0Y2ggKG1lbV90eXBlKXsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBjYXNlIDIyOiAgICByZXR1cm4gR1BNQ19PTkVOQU5EOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIGNhc2UgMjE6CisgICAgICAgICAgICBjYXNlIDI3OiAgICByZXR1cm4gR1BNQ19OQU5EOworCisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjYXNlIDY6ICAgICByZXR1cm4gTU1DX09ORU5BTkQ7CisKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgIGNhc2UgMjY6ICAgIHJldHVybiBHUE1DX01ET0M7CisKKyAgICAgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgY2FzZSAyNDoJcmV0dXJuIE1NQ19OQU5EOworCisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIGNhc2UgMTk6CisgICAgICAgICAgICBjYXNlIDI1OgorICAgICAgICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEdQTUNfTk9SOworICAgICAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jcHVfcmV2KHZvaWQpIC0gZXh0cmFjdCB2ZXJzaW9uIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgZ2V0X2NwdV9yZXYodm9pZCkKK3sKKwl1MzIgY3B1aWQ9MDsKKwkvKiBPbiBFUzEuMCB0aGUgSURDT0RFIHJlZ2lzdGVyIGlzIG5vdCBleHBvc2VkIG9uIEw0CisJICogc28gdXNpbmcgQ1BVIElEIHRvIGRpZmZlcmVudGlhdGUKKwkgKiBiZXR3ZWVuIEVTMi4wIGFuZCBFUzEuMC4KKwkgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIiAoY3B1aWQpKTsKKwlpZigoY3B1aWQgICYgMHhmKSA9PSAweDApCisJCXJldHVybiBDUFVfMzQzMF9FUzE7CisJZWxzZQorCQlyZXR1cm4gQ1BVXzM0MzBfRVMyOworCit9CisKK3UzMiBpc19jcHVfZmFtaWx5KHZvaWQpCit7CisJdTMyIGNwdWlkID0gMCwgY3B1X2ZhbWlseSA9IDA7CisJdTE2IGhhd2tleWU7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibXJjIHAxNSwgMCwgJTAsIGMwLCBjMCwgMCI6Ij1yIihjcHVpZCkpOworCWlmICgoY3B1aWQgJiAweGYpID09IDB4MCkgeworCQljcHVfZmFtaWx5ID0gQ1BVX09NQVAzNFhYOworCX0gZWxzZSB7CisJCWNwdWlkID0gX19yYXdfcmVhZGwoT01BUDM0WFhfQ09OVFJPTF9JRCk7CisJCWhhd2tleWUgID0gKGNwdWlkID4+IEhBV0tFWUVfU0hJRlQpICYgMHhmZmZmOworCisJCXN3aXRjaCAoaGF3a2V5ZSkgeworCQkJY2FzZSBIQVdLRVlFX09NQVAzNFhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBV0tFWUVfQU0zNVhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfQU0zNVhYOworCQkJCWJyZWFrOworCQkJY2FzZSBIQVdLRVlFX09NQVAzNlhYOgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM2WFg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNwdV9mYW1pbHkgPSBDUFVfT01BUDM0WFg7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNwdV9mYW1pbHk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjcHVfaXNfMzQxMCh2b2lkKSAtIHJldHVybnMgdHJ1ZSBmb3IgMzQxMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBjcHVfaXNfMzQxMCh2b2lkKQoreworCWludCBzdGF0dXM7CisJaWYoZ2V0X2NwdV9yZXYoKSA8IENQVV8zNDMwX0VTMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiByZWFkIHNjYWxhYmlsaXR5IHN0YXR1cyBhbmQgcmV0dXJuIDEgZm9yIDM0MTAqLworCQlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT05UUk9MX1NDQUxBQkxFX09NQVBfU1RBVFVTKTsKKwkJLyogQ2hlY2sgd2hldGhlciBNUFUgZnJlcXVlbmN5IGlzIHNldCB0byAyNjYgTUh6IHdoaWNoCisJCSAqIGlzIG5vbWluYWwgZm9yIDM0MTAuIElmIHllcyByZXR1cm4gdHJ1ZSBlbHNlIGZhbHNlCisJCSAqLworCQlpZiAoKChzdGF0dXMgPj4gOCkgJiAweDMpID09IDB4MikKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3IzMiAtIGNsZWFyICYgc2V0IGEgdmFsdWUgaW4gYSBiaXQgcmFuZ2UgZm9yIGEgMzIgYml0IGFkZHJlc3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc3IzMih1MzIgYWRkciwgdTMyIHN0YXJ0X2JpdCwgdTMyIG51bV9iaXRzLCB1MzIgdmFsdWUpCit7CisJdTMyIHRtcCwgbXNrID0gMDsKKwltc2sgPSAxIDw8IG51bV9iaXRzOworCS0tbXNrOworCXRtcCA9IF9fcmF3X3JlYWRsKGFkZHIpICYgfihtc2sgPDwgc3RhcnRfYml0KTsKKwl0bXAgfD0gIHZhbHVlIDw8IHN0YXJ0X2JpdDsKKwlfX3Jhd193cml0ZWwodG1wLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FpdF9vbl92YWx1ZSgpIC0gY29tbW9uIHJvdXRpbmUgdG8gYWxsb3cgd2FpdGluZyBmb3IgY2hhbmdlcyBpbgorICogICB2b2xhdGlsZSByZWdzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCkKK3sKKwl1MzIgaSA9IDAsIHZhbDsKKwlkbyB7CisJCSsraTsKKwkJdmFsID0gX19yYXdfcmVhZGwocmVhZF9hZGRyKSAmIHJlYWRfYml0X21hc2s7CisJCWlmICh2YWwgPT0gbWF0Y2hfdmFsdWUpCisJCQlyZXR1cm4gKDEpOworCQlpZiAoaSA9PSBib3VuZCkKKwkJCXJldHVybiAoMCk7CisJfSB3aGlsZSAoMSk7Cit9CisKKyNpZmRlZiBDRkdfT01BUEVWTV9ERFIKKyNpZmRlZiBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbWFrZV9jczFfY29udGlndW91cygpIC0gZm9yIGVzMiBhbmQgYWJvdmUgcmVtYXAgY3MxIGJlaGluZCBjczAgdG8gYWxsb3cKKyAqICBjb21tYW5kIGxpbmUgbWVtPXh5eiB1c2UgYWxsIG1lbW9yeSB3aXRoIG91dCBkaXNjb250aW51b3VzIHN1cHBvcnQKKyAqICBjb21waWxlZCBpbi4gIENvdWxkIGRvIGl0IGF0IHRoZSBBVEFHLCBidXQgdGhlcmUgcmVhbGx5IGlzIHR3byBiYW5rcy4uLgorICogQ2FsbGVkIGFzIHBhcnQgb2YgMm5kIHBoYXNlIEREUiBpbml0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtYWtlX2NzMV9jb250aWd1b3VzKHZvaWQpCit7CisJdTMyIHNpemUsIGFfYWRkX2xvdywgYV9hZGRfaGlnaDsKKworCXNpemUgPSBnZXRfc2RyX2NzX3NpemUoU0RSQ19DUzBfT1NFVCk7CisJc2l6ZSAvPSBTWl8zMk07ICAgICAgICAgLyogZmluZCBzaXplIHRvIG9mZnNldCBDUzEgKi8KKwlhX2FkZF9oaWdoID0gKHNpemUgJiAzKSA8PCA4OyAgIC8qIHNldCB1cCBsb3cgZmllbGQgKi8KKwlhX2FkZF9sb3cgPSAoc2l6ZSAmIDB4M0MpID4+IDI7IC8qIHNldCB1cCBoaWdoIGZpZWxkICovCisJX19yYXdfd3JpdGVsKChhX2FkZF9oaWdoIHwgYV9hZGRfbG93KSwgU0RSQ19DU19DRkcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9jczBfc2l6ZSgpIC0gZ2V0IHNpemUgb2YgY2hpcCBzZWxlY3QgMC8xCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTMyIGdldF9zZHJfY3Nfc2l6ZSh1MzIgb2Zmc2V0KQoreworCXUzMiBzaXplOworCisJLyogZ2V0IHJhbSBzaXplIGZpZWxkICovCisJc2l6ZSA9IF9fcmF3X3JlYWRsKFNEUkNfTUNGR18wICsgb2Zmc2V0KSA+PiA4OworCXNpemUgJj0gMHgzRkY7ICAgICAgICAgIC8qIHJlbW92ZSB1bndhbnRlZCBiaXRzICovCisJc2l6ZSAqPSBTWl8yTTsgICAgICAgICAgLyogZmluZCBzaXplIGluIE1CICovCisJcmV0dXJuIHNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY29uZmlnXzM0MzBzZHJhbV9kZHIoKSAtIEluaXQgRERSIG9uIDM0MzBTRFAgZGV2IGJvYXJkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY29uZmlnXzM0MzBzZHJhbV9kZHIodm9pZCkKK3sKKworI2lmbmRlZiBDT05GSUdfRERSXzI1Nk1CX1NUQUNLRUQKKwkvKiByZXNldCBzZHJjIGNvbnRyb2xsZXIgKi8KKwlfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCBCSVQwLCBTRFJDX1NUQVRVUywgMTIwMDAwMDApOworCV9fcmF3X3dyaXRlbCgwLCBTRFJDX1NZU0NPTkZJRyk7CisKKwkvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1NIQVJJTkcsIFNEUkNfU0hBUklORyk7CisKKwkvKiBzZXQgbWRjZmcgKi8KKwlfX3Jhd193cml0ZWwoU0RQX1NEUkNfTURDRkdfMF9ERFIsIFNEUkNfTUNGR18wKTsKKworCS8qIHNldCB0aW1pbmcgKi8KKwlpZiAoaXNfY3B1X2ZhbWlseSgpID09IENQVV9PTUFQMzZYWCkgeworCQlfX3Jhd193cml0ZWwoSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQV8wLCBTRFJDX0FDVElNX0NUUkxBXzApOworCQlfX3Jhd193cml0ZWwoSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCisJfSBlbHNlIHsKKwkJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX09ORU5BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfT05FTkFORCkpeworCQkJX19yYXdfd3JpdGVsKElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwkJCV9fcmF3X3dyaXRlbChJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxCXzAsIFNEUkNfQUNUSU1fQ1RSTEJfMCk7CisJCX0KKwkJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8KGdldF9tZW1fdHlwZSgpID09IE1NQ19OQU5EKSl7CisJCQlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8wKTsKKwkJCV9fcmF3X3dyaXRlbChNSUNST05fU0RSQ19BQ1RJTV9DVFJMQl8wLCBTRFJDX0FDVElNX0NUUkxCXzApOworCQl9CisJIH0KKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCk7CisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX1BPV0VSX1BPUCwgU0RSQ19QT1dFUik7CisKKwkvKiBpbml0IHNlcXVlbmNlIGZvciBtRERSL21TRFIgdXNpbmcgbWFudWFsIGNvbW1hbmRzIChERFIgaXMgZGlmZmVyZW50KSAqLworCV9fcmF3X3dyaXRlbChDTURfTk9QLCBTRFJDX01BTlVBTF8wKTsKKwlkZWxheSg1MDAwKTsKKwlfX3Jhd193cml0ZWwoQ01EX1BSRUNIQVJHRSwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCk7CisKKwkvKiBzZXQgbXIwICovCisJX19yYXdfd3JpdGVsKFNEUF9TRFJDX01SXzBfRERSLCBTRFJDX01SXzApOworCisJLyogc2V0IHVwIGRsbCAqLworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19ETExBQl9DVFJMLCBTRFJDX0RMTEFfQ1RSTCk7CisJZGVsYXkoMHgyMDAwKTsJLyogZ2l2ZSB0aW1lIHRvIGxvY2sgKi8KKyNlbHNlCisgICAgICAgLyogcmVzZXQgc2RyYyBjb250cm9sbGVyICovCisgICAgICAgICBfX3Jhd193cml0ZWwoU09GVFJFU0VULCBTRFJDX1NZU0NPTkZJRyk7CisgICAgICAgICB3YWl0X29uX3ZhbHVlKEJJVDAsIEJJVDAsIFNEUkNfU1RBVFVTLCAxMjAwMDAwMCk7CisgICAgICAgICBfX3Jhd193cml0ZWwoMCwgU0RSQ19TWVNDT05GSUcpOworCisgICAgICAgICAvKiBzZXR1cCBzZHJjIHRvIGJhbGwgbXV4ICovCisgICAgICAgICBfX3Jhd193cml0ZWwoU0RQX1NEUkNfU0hBUklORywgU0RSQ19TSEFSSU5HKTsKKworICAgICAgICAgLyogU0RSQ19NQ0ZHMCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDgwKSA9IDB4MDI1ODQwOTk7Ly9mcm9tIE1pY3JvbgorCisJIGlmIChpc19jcHVfZmFtaWx5KCkgPT0gQ1BVX09NQVAzNlhYKSB7CisJCSAvKiBTRFJDX0FDVElNX0NUUkxBMCByZWdpc3RlciAqLworCQkgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDljKSA9IDB4OTJlMWM0YzY7Ly8gZm9yIDIwME0KKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEIwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTApID0gMHgwMDAyMTExYzsKKwkgfSBlbHNlIHsKKwkJIC8qIFNEUkNfQUNUSU1fQ1RSTEEwIHJlZ2lzdGVyICovCisJCSAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwOWMpID0gMHhhYTlkYjRjNjsvLyBmb3IgMTY2TSBmcm9tIHJrdworCQkgLyogU0RSQ19BQ1RJTV9DVFJMQjAgcmVnaXN0ZXIgKi8KKwkJICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhMCkgPSAweDAwMDExNTE3OworCSB9CisKKworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE0KSA9MHgwMDA0REMwMTsKKworICAgICAgICAgLyogRGlzYmxlIFBvd2VyIERvd24gb2YgQ0tFIGN1eiBvZiAxIENLRSBvbiBjb21ibyBwYXJ0ICovCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwNzApID0gMHgwMDAwMDA4MTsKKworICAgICAgICAgLyogU0RSQ19NYW51YWwgY29tbWFuZCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDA7IC8vIE5PUCBjb21tYW5kCisgICAgICAgICBkZWxheSg1MDAwKTsKKyAgICAgICAgICgqKHVuc2lnbmVkIGludCopMHg2RDAwMDBhOCkgPSAweDAwMDAwMDAxOyAvLyBQcmVjaGFyZ2UgY29tbWFuZAorICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMGE4KSA9IDB4MDAwMDAwMDI7IC8vIEF1dG8tcmVmcmVzaCBjb21tYW5kCisgICAgICAgICAoKih1bnNpZ25lZCBpbnQqKTB4NkQwMDAwYTgpID0gMHgwMDAwMDAwMjsgLy8gQXV0by1yZWZyZXNoIGNvbW1hbmQKKworICAgICAgICAgLyogU0RSQyBNUjAgcmVnaXN0ZXIgKi8KKyAgICAgICAgICgqKGludCopMHg2RDAwMDA4NCkgPSAweDAwMDAwMDMyOyAvLyBCdXJzdCBsZW5ndGggPTQKKyAgICAgICAgIC8vIENBUyBsYXRlbmN5ID0gMworICAgICAgICAgLy8gV3JpdGUgQnVyc3QgPSBSZWFkIEJ1cnN0CisgICAgICAgICAvLyBTZXJpYWwgTW9kZQorCisgICAgICAgICAvKiBTRFJDIERMTEEgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICAgKCoodW5zaWduZWQgaW50KikweDZEMDAwMDYwKSA9IDB4MDAwMEE7CisgICAgICAgICBkZWxheSgweDIwMDAwKTsgLy8gc29tZSBkZWxheQorCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ERFJfMjU2TUJfU1RBQ0tFRAorCW1ha2VfY3MxX2NvbnRpZ3VvdXMoKTsKKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NRENGR18wX0REUiwgU0RSQ19NQ0ZHXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCwgU0RSQ19BQ1RJTV9DVFJMQV8xKTsKKwlfX3Jhd193cml0ZWwoTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCwgU0RSQ19BQ1RJTV9DVFJMQl8xKTsKKworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19SRlJfQ1RSTCwgU0RSQ19SRlJfQ1RSTCArIFNEUkNfQ1MxX09TRVQpOworCS8qIGluaXQgc2VxdWVuY2UgZm9yIG1ERFIvbVNEUiB1c2luZyBtYW51YWwgY29tbWFuZHMgKi8KKwlfX3Jhd193cml0ZWwoQ01EX05PUCwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCWRlbGF5KDUwMDApOyAgIC8qIHN1cHBvc2VkIHRvIGJlIDEwMHVzIHBlciBkZXNpZ24gc3BlYyBmb3IgbWRkci9tc2RyICovCisJX19yYXdfd3JpdGVsKENNRF9QUkVDSEFSR0UsIFNEUkNfTUFOVUFMXzAgKyBTRFJDX0NTMV9PU0VUKTsKKwlfX3Jhd193cml0ZWwoQ01EX0FVVE9SRUZSRVNILCBTRFJDX01BTlVBTF8wICsgU0RSQ19DUzFfT1NFVCk7CisJX19yYXdfd3JpdGVsKENNRF9BVVRPUkVGUkVTSCwgU0RSQ19NQU5VQUxfMCArIFNEUkNfQ1MxX09TRVQpOworCV9fcmF3X3dyaXRlbChTRFBfU0RSQ19NUl8wX0REUiwgU0RSQ19NUl8wICsgU0RSQ19DUzFfT1NFVCk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBDRkdfT01BUEVWTV9ERFIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGdldF9zeXNfY2xrX3NwZWVkIC0gZGV0ZXJtaW5lIHJlZmVyZW5jZSBvc2NpbGxhdG9yIHNwZWVkCisgKiAgYmFzZWQgb24ga25vd24gMzJrSHogY2xvY2sgYW5kIGdwdGltZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3UzMiBnZXRfb3NjX2Nsa19zcGVlZCh2b2lkKQoreworCXUzMiBzdGFydCwgY3N0YXJ0LCBjZW5kLCBjZGlmZiwgY2RpdiwgdmFsOworCisJdmFsID0gX19yYXdfcmVhZGwoUFJNX0NMS1NSQ19DVFJMKTsKKworCWlmICh2YWwgJiBCSVQ3KQorCQljZGl2ID0gMjsKKwllbHNlIGlmICh2YWwgJiBCSVQ2KQorCQljZGl2ID0gMTsKKwllbHNlCisJCS8qCisJCSAqIFNob3VsZCBuZXZlciByZWFjaCBoZXJlIQorCQkgKiBUQkQ6IEFkZCBhIFdBUk4oKS9CVUcoKQorCQkgKiAgICAgIEZvciBub3csIGFzc3VtZSBkaXZpZGVyIGFzIDEuCisJCSAqLworCQljZGl2ID0gMTsKKworCS8qIGVuYWJsZSB0aW1lcjIgKi8KKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9DTEtTRUxfV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0NMS1NFTF9XS1VQKTsJLyogc2VsZWN0IHN5c19jbGsgZm9yIEdQVDEgKi8KKworCS8qIEVuYWJsZSBJIGFuZCBGIENsb2NrcyBmb3IgR1BUMSAqLworCXZhbCA9IF9fcmF3X3JlYWRsKENNX0lDTEtFTl9XS1VQKSB8IEJJVDAgfCBCSVQyOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0lDTEtFTl9XS1VQKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChDTV9GQ0xLRU5fV0tVUCkgfCBCSVQwOworCV9fcmF3X3dyaXRlbCh2YWwsIENNX0ZDTEtFTl9XS1VQKTsKKworCV9fcmF3X3dyaXRlbCgwLCBPTUFQMzRYWF9HUFQxICsgVExEUik7CS8qIHN0YXJ0IGNvdW50aW5nIGF0IDAgKi8KKwlfX3Jhd193cml0ZWwoR1BUX0VOLCBPTUFQMzRYWF9HUFQxICsgVENMUik7ICAgICAvKiBlbmFibGUgY2xvY2sgKi8KKwkvKiBlbmFibGUgMzJrSHogc291cmNlICovLyogZW5hYmxlZCBvdXQgb2YgcmVzZXQgKi8KKwkvKiBkZXRlcm1pbmUgc3lzX2NsayB2aWEgZ2F1Z2luZyAqLworCisJc3RhcnQgPSAyMCArIF9fcmF3X3JlYWRsKFMzMktfQ1IpOwkvKiBzdGFydCB0aW1lIGluIDIwIGN5Y2xlcyAqLworCXdoaWxlIChfX3Jhd19yZWFkbChTMzJLX0NSKSA8IHN0YXJ0KTsJLyogZGVhZCBsb29wIHRpbGwgc3RhcnQgdGltZSAqLworCWNzdGFydCA9IF9fcmF3X3JlYWRsKE9NQVAzNFhYX0dQVDEgKyBUQ1JSKTsJLyogZ2V0IHN0YXJ0IHN5c19jbGsgY291bnQgKi8KKwl3aGlsZSAoX19yYXdfcmVhZGwoUzMyS19DUikgPCAoc3RhcnQgKyAyMCkpOwkvKiB3YWl0IGZvciA0MCBjeWNsZXMgKi8KKwljZW5kID0gX19yYXdfcmVhZGwoT01BUDM0WFhfR1BUMSArIFRDUlIpOwkvKiBnZXQgZW5kIHN5c19jbGsgY291bnQgKi8KKwljZGlmZiA9IGNlbmQgLSBjc3RhcnQ7CQkJCS8qIGdldCBlbGFwc2VkIHRpY2tzICovCisKKwlpZiAoY2RpdiA9PSAyKQorCXsKKwkJY2RpZmYgKj0gMjsKKwl9CisKKwkvKiBiYXNlZCBvbiBudW1iZXIgb2YgdGlja3MgYXNzaWduIHNwZWVkICovCisJaWYgKGNkaWZmID4gMTkwMDApCisJCXJldHVybiAoUzM4XzRNKTsKKwllbHNlIGlmIChjZGlmZiA+IDE1MjAwKQorCQlyZXR1cm4gKFMyNk0pOworCWVsc2UgaWYgKGNkaWZmID4gMTMwMDApCisJCXJldHVybiAoUzI0TSk7CisJZWxzZSBpZiAoY2RpZmYgPiA5MDAwKQorCQlyZXR1cm4gKFMxOV8yTSk7CisJZWxzZSBpZiAoY2RpZmYgPiA3NjAwKQorCQlyZXR1cm4gKFMxM00pOworCWVsc2UKKwkJcmV0dXJuIChTMTJNKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2V0X3N5c19jbGtpbl9zZWwoKSAtIHJldHVybnMgdGhlIHN5c19jbGtpbl9zZWwgZmllbGQgdmFsdWUgYmFzZWQgb24KKyAqICAgLS0gaW5wdXQgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBnZXRfc3lzX2Nsa2luX3NlbCh1MzIgb3NjX2NsaywgdTMyICpzeXNfY2xraW5fc2VsKQoreworCWlmKG9zY19jbGsgPT0gUzM4XzRNKQorCQkqc3lzX2Nsa2luX3NlbD0gIDQ7CisJZWxzZSBpZihvc2NfY2xrID09IFMyNk0pCisJCSpzeXNfY2xraW5fc2VsID0gMzsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzE5XzJNKQorCQkqc3lzX2Nsa2luX3NlbCA9IDI7CisJZWxzZSBpZihvc2NfY2xrID09IFMxM00pCisJCSpzeXNfY2xraW5fc2VsID0gMTsKKwllbHNlIGlmKG9zY19jbGsgPT0gUzEyTSkKKwkJKnN5c19jbGtpbl9zZWwgPSAwOworfQorCisvKgorICogT01BUDM0eC8zNXggc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIGRwbGwzX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyBvZiBDb3JlIERQTEwgcGFyYW0gdGFibGUqLworCXB0ciA9IChkcGxsX3BhcmFtICopZ2V0X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBDT1JFIERQTEwgKi8KKwkvKiBTZWxlY3QgcmVsb2NrIGJ5cGFzczogQ01fQ0xLRU5fUExMWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMCwgMywgUExMX0ZBU1RfUkVMT0NLX0JZUEFTUyk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwkvKiBDTV9DTEtTRUwxX0VNVVtESVZfRFBMTDNdICovCisJc3IzMihDTV9DTEtTRUwxX0VNVSwgMTYsIDUsIENPUkVfTTNYMik7CisKKwkvKiBNMiAoQ09SRV9EUExMX0NMS09VVF9ESVYpOiBDTV9DTEtTRUwxX1BMTFsyNzozMV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMLCAyNywgNSwgcHRyLT5tMik7CisKKwkvKiBNIChDT1JFX0RQTExfTVVMVCk6IENNX0NMS1NFTDFfUExMWzE2OjI2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDE2LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKENPUkVfRFBMTF9ESVYpOiBDTV9DTEtTRUwxX1BMTFs4OjE0XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDgsIDcsIHB0ci0+bik7CisKKwkvKiBTb3VyY2UgaXMgdGhlIENNXzk2TV9GQ0xLOiBDTV9DTEtTRUwxX1BMTFs2XSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDYsIDEsIDApOworCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgOCwgNCwgQ09SRV9TU0lfRElWKTsJLyogc3NpICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgNCwgMiwgQ09SRV9GVVNCX0RJVik7CS8qIGZzdXNiICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMiwgMiwgQ09SRV9MNF9ESVYpOwkvKiBsNCAqLworCXNyMzIoQ01fQ0xLU0VMX0NPUkUsIDAsIDIsIENPUkVfTDNfRElWKTsJLyogbDMgKi8KKworCXNyMzIoQ01fQ0xLU0VMX0dGWCwgIDAsIDMsIEdGWF9ESVZfMzRYKTsJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBkcGxsNF9pbml0XzM0eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlkcGxsX3BhcmFtICpwdHI7CisKKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9wZXJfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYmFzZSAqLworCXB0ciA9IHB0ciArIGNsa19pbmRleDsKKworCS8qIEVOX1BFUklQSF9EUExMOiBDTV9DTEtFTl9QTExbMTY6MThdICovCisJc3IzMihDTV9DTEtFTl9QTEwsIDE2LCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQxLCAwLCBDTV9JRExFU1RfQ0tHRU4sIExERUxBWSk7CisKKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNSwgUEVSX002WDIpOwkJLyogc2V0IE02ICovCisJc3IzMihDTV9DTEtTRUxfQ0FNLCAwLCA1LCBQRVJfTTVYMik7CQkvKiBzZXQgTTUgKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDAsIDUsIFBFUl9NNFgyKTsJCS8qIHNldCBNNCAqLworCXNyMzIoQ01fQ0xLU0VMX0RTUywgOCwgNSwgUEVSX00zWDIpOwkJLyogc2V0IE0zICovCisKKwkvKiBNMiAoRElWXzk2TSk6IENNX0NMS1NFTDNfUExMWzA6NF0gKi8KKwlzcjMyKENNX0NMS1NFTDNfUExMLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKFBFUklQSF9EUExMX01VTFQpOiBDTV9DTEtTRUwyX1BMTFs4OjE4XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoUEVSSVBIX0RQTExfRElWKTogQ01fQ0xLU0VMMl9QTExbMDo2XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTEwsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChQRVJJUEhfRFBMTF9GUkVRU0VMKTogQ01fQ0xLRU5fUExMWzIwOjIzXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAyMCwgNCwgcHRyLT5mc2VsKTsKKworCS8qIExPQ0sgTU9ERSAoRU5fUEVSSVBIX0RQTEwpIDogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBtcHVfaW5pdF8zNHh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF9tcHVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyID0gcHRyICsgMipjbGtfaW5kZXggKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBGUkVRU0VMIChNUFVfRFBMTF9GUkVRU0VMKSA6IENNX0NMS0VOX1BMTF9NUFVbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgNCwgNCwgcHRyLT5mc2VsKTsKK30KKworc3RhdGljIHZvaWQgaXZhX2luaXRfMzR4eCh1MzIgc2lsX2luZGV4LCB1MzIgY2xrX2luZGV4KQoreworCWRwbGxfcGFyYW0gKnB0cjsKKworCS8qIEdldHRpbmcgdGhlIGJhc2UgYWRkcmVzcyB0byBJVkEgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArIDIqY2xrX2luZGV4ICsgc2lsX2luZGV4OworCisJLyogSVZBIERQTEwgKi8KKwkvKiBFTl9JVkEyX0RQTEwgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX1NUT1ApOworCXdhaXRfb25fdmFsdWUoQklUMCwgMCwgQ01fSURMRVNUX1BMTF9JVkEyLCBMREVMQVkpOworCisJLyogTTIgKElWQTJfRFBMTF9DTEtPVVRfRElWKSA6IENNX0NMS1NFTDJfUExMX0lWQTJbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfSVZBMiwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChJVkEyX0RQTExfTVVMVCkgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCA4LCAxMSwgcHRyLT5tKTsKKworCS8qIE4gKElWQTJfRFBMTF9ESVYpIDogQ01fQ0xLU0VMMV9QTExfSVZBMlswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9JVkEyLCAwLCA3LCBwdHItPm4pOworCisJLyogRlJFUVNFTCAoSVZBMl9EUExMX0ZSRVFTRUwpIDogQ01fQ0xLRU5fUExMX0lWQTJbNDo3XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMX0lWQTIsIDQsIDQsIHB0ci0+ZnNlbCk7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKy8qCisgKiBPTUFQMzYzMCBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqLworc3RhdGljIHZvaWQgZHBsbDNfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIG9mIENvcmUgRFBMTCBwYXJhbSB0YWJsZSovCisJcHRyID0gKGRwbGxfcGFyYW0gKilnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbSgpOworCisJLyogTW92aW5nIGl0IHRvIHRoZSByaWdodCBzeXNjbGsgYW5kIEVTIHJldiBiYXNlICovCisJcHRyICs9IGNsa19pbmRleDsKKworCS8qIENPUkUgRFBMTCAqLworCS8qIFNlbGVjdCByZWxvY2sgYnlwYXNzOiBDTV9DTEtFTl9QTExbMDoyXSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAwLCAzLCBQTExfRkFTVF9SRUxPQ0tfQllQQVNTKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIENNX0NMS1NFTDFfRU1VW0RJVl9EUExMM10gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAxNiwgNSwgQ09SRV9NM1gyKTsKKworCS8qIE0yIChDT1JFX0RQTExfQ0xLT1VUX0RJVik6IENNX0NMS1NFTDFfUExMWzI3OjMxXSAqLworCXNyMzIoQ01fQ0xLU0VMMV9QTEwsIDI3LCA1LCBwdHItPm0yKTsKKworCS8qIE0gKENPUkVfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMV9QTExbMTY6MjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgMTYsIDExLCBwdHItPm0pOworCisJLyogTiAoQ09SRV9EUExMX0RJVik6IENNX0NMS1NFTDFfUExMWzg6MTRdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgOCwgNywgcHRyLT5uKTsKKworCS8qIFNvdXJjZSBpcyB0aGUgQ01fOTZNX0ZDTEs6IENNX0NMS1NFTDFfUExMWzZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTCwgNiwgMSwgMCk7CisKKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA4LCA0LCBDT1JFX1NTSV9ESVYpOwkvKiBzc2kgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCA0LCAyLCBDT1JFX0ZVU0JfRElWKTsJLyogZnN1c2IgKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAyLCAyLCBDT1JFX0w0X0RJVik7CS8qIGw0ICovCisJc3IzMihDTV9DTEtTRUxfQ09SRSwgMCwgMiwgQ09SRV9MM19ESVYpOwkvKiBsMyAqLworCisJc3IzMihDTV9DTEtTRUxfR0ZYLCAgMCwgMywgR0ZYX0RJVl8zNlgpOwkJLyogZ2Z4ICovCisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMSwgMiwgV0tVUF9SU00pOwkJLyogcmVzZXQgbWdyICovCisKKwkvKiBGUkVRU0VMIChDT1JFX0RQTExfRlJFUVNFTCk6IENNX0NMS0VOX1BMTFs0OjddICovCisJc3IzMihDTV9DTEtFTl9QTEwsICAgNCwgNCwgcHRyLT5mc2VsKTsKKwlzcjMyKENNX0NMS0VOX1BMTCwgICAwLCAzLCBQTExfTE9DSyk7CQkvKiBsb2NrIG1vZGUgKi8KKworCXdhaXRfb25fdmFsdWUoQklUMCwgMSwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBkcGxsNF9pbml0XzM2eHgodTMyIHNpbF9pbmRleCwgdTMyIGNsa19pbmRleCkKK3sKKwlzdHJ1Y3QgZHBsbF9wZXJfMzZ4X3BhcmFtICpwdHI7CisKKwlwdHIgPSAoc3RydWN0IGRwbGxfcGVyXzM2eF9wYXJhbSAqKWdldF8zNnhfcGVyX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGJhc2UgKi8KKwlwdHIgKz0gY2xrX2luZGV4OworCisJLyogRU5fUEVSSVBIX0RQTEw6IENNX0NMS0VOX1BMTFsxNjoxOF0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTCwgMTYsIDMsIFBMTF9TVE9QKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDEsIDAsIENNX0lETEVTVF9DS0dFTiwgTERFTEFZKTsKKworCS8qIE02IChESVZfRFBMTDQpOiBDTV9DTEtTRUwxX0VNVVsyNDoyOV0gKi8KKwlzcjMyKENNX0NMS1NFTDFfRU1VLCAyNCwgNiwgcHRyLT5tNik7CisKKwkvKiBNNSAoQ0xLU0VMX0NBTSk6IENNX0NMS1NFTDFfRU1VWzA6NV0gKi8KKwlzcjMyKENNX0NMS1NFTF9DQU0sIDAsIDYsIHB0ci0+bTUpOworCisJLyogTTQgKENMS1NFTF9EU1MxKTogQ01fQ0xLU0VMX0RTU1swOjVdICovCisJc3IzMihDTV9DTEtTRUxfRFNTLCAwLCA2LCBwdHItPm00KTsKKworCS8qIE0zIChDTEtTRUxfRFNTMSk6IENNX0NMS1NFTF9EU1NbODoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9EU1MsIDgsIDYsIHB0ci0+bTMpOworCisJLyogTTIgKERJVl85Nk0pOiBDTV9DTEtTRUwzX1BMTFswOjRdICovCisJc3IzMihDTV9DTEtTRUwzX1BMTCwgMCwgNSwgcHRyLT5tMik7CisKKwkvKiBNIChQRVJJUEhfRFBMTF9NVUxUKTogQ01fQ0xLU0VMMl9QTExbODoxOV0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCA4LCAxMiwgcHRyLT5tKTsKKworCS8qIE4gKFBFUklQSF9EUExMX0RJVik6IENNX0NMS1NFTDJfUExMWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDJfUExMLCAwLCA3LCBwdHItPm4pOworCisJLyogTTJESVYgKENMS1NFTF85Nk0pOiBDTV9DTEtTRUxfQ09SRVsxMjoxM10gKi8KKwlzcjMyKENNX0NMS1NFTF9DT1JFLCAxMiwgMiwgcHRyLT5tMmRpdik7CisKKwkvKiBMT0NLIE1PREUgKEVOX1BFUklQSF9EUExMKTogQ01fQ0xLRU5fUExMWzE2OjE4XSAqLworCXNyMzIoQ01fQ0xLRU5fUExMLCAxNiwgMywgUExMX0xPQ0spOworCXdhaXRfb25fdmFsdWUoQklUMSwgMiwgQ01fSURMRVNUX0NLR0VOLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBtcHVfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIE1QVSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfbXB1X2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBNUFUgRFBMTCAodW5sb2NrZWQgYWxyZWFkeSkgKi8KKwkvKiBNMiAoTVBVX0RQTExfQ0xLT1VUX0RJVikgOiBDTV9DTEtTRUwyX1BMTF9NUFVbMDo0XSAqLworCXNyMzIoQ01fQ0xLU0VMMl9QTExfTVBVLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKE1QVV9EUExMX01VTFQpIDogQ01fQ0xLU0VMMl9QTExfTVBVWzg6MThdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoTVBVX0RQTExfRElWKSA6IENNX0NMS1NFTDJfUExMX01QVVswOjZdICovCisJc3IzMihDTV9DTEtTRUwxX1BMTF9NUFUsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX01QVV9EUExMKSA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT0NLKTsKKwl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworfQorCitzdGF0aWMgdm9pZCBpdmFfaW5pdF8zNnh4KHUzMiBzaWxfaW5kZXgsIHUzMiBjbGtfaW5kZXgpCit7CisJZHBsbF9wYXJhbSAqcHRyOworCisJLyogR2V0dGluZyB0aGUgYmFzZSBhZGRyZXNzIHRvIElWQSBEUExMIHBhcmFtIHRhYmxlKi8KKwlwdHIgPSAoZHBsbF9wYXJhbSAqKWdldF8zNnhfaXZhX2RwbGxfcGFyYW0oKTsKKworCS8qIE1vdmluZyBpdCB0byB0aGUgcmlnaHQgc3lzY2xrIGFuZCBFUyByZXYgYmFzZSAqLworCXB0ciA9IHB0ciArICgyKmNsa19pbmRleCkgKyBzaWxfaW5kZXg7CisKKwkvKiBJVkEgRFBMTCAqLworCS8qIEVOX0lWQTJfRFBMTCA6IENNX0NMS0VOX1BMTF9JVkEyWzA6Ml0gKi8KKwlzcjMyKENNX0NMS0VOX1BMTF9JVkEyLCAwLCAzLCBQTExfU1RPUCk7CisJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7CisKKwkvKiBNMiAoSVZBMl9EUExMX0NMS09VVF9ESVYpIDogQ01fQ0xLU0VMMl9QTExfSVZBMlswOjRdICovCisJc3IzMihDTV9DTEtTRUwyX1BMTF9JVkEyLCAwLCA1LCBwdHItPm0yKTsKKworCS8qIE0gKElWQTJfRFBMTF9NVUxUKSA6IENNX0NMS1NFTDFfUExMX0lWQTJbODoxOF0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDgsIDExLCBwdHItPm0pOworCisJLyogTiAoSVZBMl9EUExMX0RJVikgOiBDTV9DTEtTRUwxX1BMTF9JVkEyWzA6Nl0gKi8KKwlzcjMyKENNX0NMS1NFTDFfUExMX0lWQTIsIDAsIDcsIHB0ci0+bik7CisKKwkvKiBMT0NLIE1PREUgKEVOX0lWQTJfRFBMTCkgOiBDTV9DTEtFTl9QTExfSVZBMlswOjJdICovCisJc3IzMihDTV9DTEtFTl9QTExfSVZBMiwgMCwgMywgUExMX0xPQ0spOworCisJd2FpdF9vbl92YWx1ZShCSVQwLCAxLCBDTV9JRExFU1RfUExMX0lWQTIsIExERUxBWSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcHJjbV9pbml0KCkgLSBpbml0cyBjbG9ja3MgZm9yIFBSQ00gYXMgZGVmaW5lZCBpbiBjbG9ja3MuaAorICogICAtLSBjYWxsZWQgZnJvbSBTUkFNLCBvciBGbGFzaCAodXNpbmcgdGVtcCBTUkFNIHN0YWNrKS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJjbV9pbml0KHZvaWQpCit7CisJdTMyIG9zY19jbGs9MCwgc3lzX2Nsa2luX3NlbDsKKwl1MzIgY2xrX2luZGV4LCBzaWxfaW5kZXg7CisKKwkvKiBHYXVnZSB0aGUgaW5wdXQgY2xvY2sgc3BlZWQgYW5kIGZpbmQgb3V0IHRoZSBzeXNfY2xraW5fc2VsCisJICogdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgY2xvY2suCisJICovCisJb3NjX2NsayA9IGdldF9vc2NfY2xrX3NwZWVkKCk7CisJZ2V0X3N5c19jbGtpbl9zZWwob3NjX2NsaywgJnN5c19jbGtpbl9zZWwpOworCisJc3IzMihQUk1fQ0xLU0VMLCAwLCAzLCBzeXNfY2xraW5fc2VsKTsgLyogc2V0IGlucHV0IGNyeXN0YWwgc3BlZWQgKi8KKworCS8qIElmIHRoZSBpbnB1dCBjbG9jayBpcyBncmVhdGVyIHRoYW4gMTkuMk0gYWx3YXlzIGRpdmlkZS8yICovCisJLyoKKwkgKiBPbiBPTUFQMzYzMCwgRERSIGRhdGEgY29ycnVwdGlvbiBoYXMgYmVlbiBvYnNlcnZlZCBvbiBPRkYgbW9kZQorCSAqIGV4aXQgaWYgdGhlIHN5cyBjbG9jayB3YXMgbG93ZXIgdGhhbiAyNk0uIEFzIGEgd29yayBhcm91bmQsCisJICogT01BUDM2MzAgaXMgb3BlcmF0ZWQgYXQgMjZNIHN5cyBjbG9jayBhbmQgdGhpcyBpbnRlcm5hbCBkaXZpc2lvbgorCSAqIGlzIG5vdCBwZXJmb3JtZWQuCisJICovCisJaWYoKGlzX2NwdV9mYW1pbHkoKSAhPSBDUFVfT01BUDM2WFgpICYmIChzeXNfY2xraW5fc2VsID4gMikpIHsKKwkJc3IzMihQUk1fQ0xLU1JDX0NUUkwsIDYsIDIsIDIpOy8qIGlucHV0IGNsb2NrIGRpdmlkZXIgKi8KKwkJY2xrX2luZGV4ID0gc3lzX2Nsa2luX3NlbC8yOworCX0gZWxzZSB7CisJCXNyMzIoUFJNX0NMS1NSQ19DVFJMLCA2LCAyLCAxKTsvKiBpbnB1dCBjbG9jayBkaXZpZGVyICovCisJCWNsa19pbmRleCA9IHN5c19jbGtpbl9zZWw7CisJfQorCisJaWYgKGlzX2NwdV9mYW1pbHkoKSA9PSBDUFVfT01BUDM2WFgpIHsKKwkJZHBsbDNfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWRwbGw0X2luaXRfMzZ4eCgwLCBjbGtfaW5kZXgpOworCQltcHVfaW5pdF8zNnh4KDAsIGNsa19pbmRleCk7CisJCWl2YV9pbml0XzM2eHgoMCwgY2xrX2luZGV4KTsKKwl9IGVsc2UgeworCQlzaWxfaW5kZXggPSBnZXRfY3B1X3JldigpIC0gMTsKKworCQkvKiBUaGUgRFBMTCB0YWJsZXMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIHN5c2NsayB2YWx1ZSBhbmQKKwkJICogc2lsaWNvbiByZXZpc2lvbi4gVGhlIGNsa19pbmRleCB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gZ2V0CisJCSAqIHRoZSB2YWx1ZXMgZm9yIHRoYXQgaW5wdXQgc3lzY2xrIGZyb20gdGhlIERQTEwgcGFyYW0gdGFibGUKKwkJICogYW5kIHNpbF9pbmRleCB3aWxsIGdldCB0aGUgdmFsdWVzIGZvciB0aGF0IFN5c0NsayBmb3IgdGhlCisJCSAqIGFwcHJvcHJpYXRlIHNpbGljb24gcmV2LgorCQkgKi8KKworCQkvKiBVbmxvY2sgTVBVIERQTEwgKHNsb3dzIHRoaW5ncyBkb3duLCBhbmQgbmVlZGVkIGxhdGVyKSAqLworCQlzcjMyKENNX0NMS0VOX1BMTF9NUFUsIDAsIDMsIFBMTF9MT1dfUE9XRVJfQllQQVNTKTsKKwkJd2FpdF9vbl92YWx1ZShCSVQwLCAwLCBDTV9JRExFU1RfUExMX01QVSwgTERFTEFZKTsKKworCQlkcGxsM19pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlkcGxsNF9pbml0XzM0eHgoc2lsX2luZGV4LCBjbGtfaW5kZXgpOworCQlpdmFfaW5pdF8zNHh4KHNpbF9pbmRleCwgY2xrX2luZGV4KTsKKwkJbXB1X2luaXRfMzR4eChzaWxfaW5kZXgsIGNsa19pbmRleCk7CisKKwkJLyogTG9jayBNUFUgRFBMTCB0byBzZXQgZnJlcXVlbmN5ICovCisJCXNyMzIoQ01fQ0xLRU5fUExMX01QVSwgMCwgMywgUExMX0xPQ0spOworCQl3YWl0X29uX3ZhbHVlKEJJVDAsIDEsIENNX0lETEVTVF9QTExfTVBVLCBMREVMQVkpOworCX0KKworCS8qIFNldCB1cCBHUFRpbWVycyB0byBzeXNfY2xrIHNvdXJjZSBvbmx5ICovCisgCXNyMzIoQ01fQ0xLU0VMX1BFUiwgMCwgOCwgMHhmZik7CisJc3IzMihDTV9DTEtTRUxfV0tVUCwgMCwgMSwgMSk7CisKKwlkZWxheSg1MDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZWN1cmVfdW5sb2NrCisgKiBEZXNjcmlwdGlvbjogU2V0dXAgc2VjdXJpdHkgcmVnaXN0ZXJzIGZvciBhY2Nlc3MKKyAqIChHUCBEZXZpY2Ugb25seSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgc2VjdXJlX3VubG9jayh2b2lkKQoreworCS8qIFBlcm1pc3Npb24gdmFsdWVzIGZvciByZWdpc3RlcnMgLUZ1bGwgZmxlZGdlZCBwZXJtaXNzaW9ucyB0byBhbGwgKi8KKwkjZGVmaW5lIFVOTE9DS18xIDB4RkZGRkZGRkYKKwkjZGVmaW5lIFVOTE9DS18yIDB4MDAwMDAwMDAKKwkjZGVmaW5lIFVOTE9DS18zIDB4MDAwMEZGRkYKKwkvKiBQcm90ZWN0aW9uIE1vZHVsZSBSZWdpc3RlciBUYXJnZXQgQVBFIChQTV9SVCkqLworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgUlRfUkVRX0lORk9fUEVSTUlTU0lPTl8xKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzEsIFJUX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBSVF9BRERSX01BVENIXzEpOworCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBHUE1DX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBPQ01fUkVBRF9QRVJNSVNTSU9OXzApOworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMywgT0NNX1dSSVRFX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18yLCBPQ01fQUREUl9NQVRDSF8yKTsKKworCS8qIElWQSBDaGFuZ2VzICovCisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMCk7CisJX19yYXdfd3JpdGVsKFVOTE9DS18zLCBJVkEyX1JFQURfUEVSTUlTU0lPTl8wKTsKKwlfX3Jhd193cml0ZWwoVU5MT0NLXzMsIElWQTJfV1JJVEVfUEVSTUlTU0lPTl8wKTsKKworCV9fcmF3X3dyaXRlbChVTkxPQ0tfMSwgU01TX1JHX0FUVDApOyAvKiBTRFJDIHJlZ2lvbiAwIHB1YmxpYyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogdHJ5X3VubG9ja19zcmFtKCkKKyAqIERlc2NyaXB0aW9uOiBJZiBjaGlwIGlzIEdQIHR5cGUsIHVubG9jayB0aGUgU1JBTSBmb3IKKyAqICBnZW5lcmFsIHVzZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdHJ5X3VubG9ja19tZW1vcnkodm9pZCkKK3sKKwlpbnQgbW9kZTsKKworCS8qIGlmIEdQIGRldmljZSB1bmxvY2sgZGV2aWNlIFNSQU0gZm9yIGdlbmVyYWwgdXNlICovCisJLyogc2VjdXJlIGNvZGUgYnJlYWtzIGZvciBTZWN1cmUvRW11bGF0aW9uIGRldmljZSAtIEhTL0UvVCovCisJbW9kZSA9IGdldF9kZXZpY2VfdHlwZSgpOworCWlmIChtb2RlID09IEdQX0RFVklDRSkgeworCQlzZWN1cmVfdW5sb2NrKCk7CisJfQorCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHNfaW5pdAorICogRGVzY3JpcHRpb246IERvZXMgZWFybHkgc3lzdGVtIGluaXQgb2YgbXV4aW5nIGFuZCBjbG9ja3MuCisgKiAtIENhbGxlZCBhdCB0aW1lIHdoZW4gb25seSBzdGFjayBpcyBhdmFpbGFibGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBzX2luaXQodm9pZCkKK3sKKwl3YXRjaGRvZ19pbml0KCk7CisjaWZkZWYgQ09ORklHXzM0MzBfQVNfMzQxMAorCS8qIHNldHVwIHRoZSBzY2FsYWJpbGl0eSBjb250cm9sIHJlZ2lzdGVyIGZvcgorCSAqIDM0MzAgdG8gd29yayBpbiAzNDEwIG1vZGUKKwkgKi8KKwlfX3Jhd193cml0ZWwoMHg1QUJGLENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1ApOworI2VuZGlmCisJdHJ5X3VubG9ja19tZW1vcnkoKTsKKwlzZXRfbXV4Y29uZl9yZWdzKCk7CisJZGVsYXkoMTAwKTsKKwlwcmNtX2luaXQoKTsKKwlwZXJfY2xvY2tzX2VuYWJsZSgpOworCWNvbmZpZ18zNDMwc2RyYW1fZGRyKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBtaXNjX2luaXRfcgorICogRGVzY3JpcHRpb246IEluaXQgZXRoZXJuZXQgKGRvbmUgaGVyZSBzbyB1ZGVsYXkgd29ya3MpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgbWlzY19pbml0X3IgKHZvaWQpCit7CisJcmV0dXJuKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiB3YWl0X2Zvcl9jb21tYW5kX2NvbXBsZXRlCisgKiBEZXNjcmlwdGlvbjogV2FpdCBmb3IgcG9zdGluZyB0byBmaW5pc2ggb24gd2F0Y2hkb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHdhaXRfZm9yX2NvbW1hbmRfY29tcGxldGUodW5zaWduZWQgaW50IHdkX2Jhc2UpCit7CisJaW50IHBlbmRpbmcgPSAxOworCWRvIHsKKwkJcGVuZGluZyA9IF9fcmF3X3JlYWRsKHdkX2Jhc2UgKyBXV1BTKTsKKwl9IHdoaWxlIChwZW5kaW5nKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IHdhdGNoZG9nX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTaHV0IGRvd24gd2F0Y2ggZG9ncworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpCit7CisJLyogVGhlcmUgYXJlIDMgd2F0Y2ggZG9ncyBXRDE9U2VjdXJlLCBXRDI9TVBVLCBXRDM9SVZBLiBXRDEgaXMKKwkgKiBlaXRoZXIgdGFrZW4gY2FyZSBvZiBieSBST00gKEhTL0VNVSkgb3Igbm90IGFjY2Vzc2libGUgKEdQKS4KKwkgKiBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiBXRDItTVBVIG9yIHRha2UgYSBQUkNNIHJlc2V0LiAgV0QzCisJICogc2hvdWxkIG5vdCBiZSBydW5uaW5nIGFuZCBkb2VzIG5vdCBnZW5lcmF0ZSBhIFBSQ00gcmVzZXQuCisJICovCisJc3IzMihDTV9GQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJc3IzMihDTV9JQ0xLRU5fV0tVUCwgNSwgMSwgMSk7CisJd2FpdF9vbl92YWx1ZShCSVQ1LCAweDIwLCBDTV9JRExFU1RfV0tVUCwgNSk7IC8qIHNvbWUgaXNzdWUgaGVyZSAqLworCisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzEsIFdEMl9CQVNFICsgV1NQUik7CisJd2FpdF9mb3JfY29tbWFuZF9jb21wbGV0ZShXRDJfQkFTRSk7CisJX19yYXdfd3JpdGVsKFdEX1VOTE9DSzIsIFdEMl9CQVNFICsgV1NQUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBkcmFtX2luaXQKKyAqIERlc2NyaXB0aW9uOiBzZXRzIHVib290cyBpZGVhIG9mIHNkcmFtIHNpemUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRyYW1faW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBwZXJpcGhlcmFsX2VuYWJsZQorICogRGVzY3JpcHRpb246IEVuYWJsZSB0aGUgY2xrcyAmIHBvd2VyIGZvciBwZXJpZnMgKEdQVDIsIFVBUlQxLC4uLikKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHBlcl9jbG9ja3NfZW5hYmxlKHZvaWQpCit7CisJLyogRW5hYmxlIEdQMiB0aW1lci4gKi8KKwlzcjMyKENNX0NMS1NFTF9QRVIsIDAsIDEsIDB4MSk7IC8qIEdQVDIgPSBzeXMgY2xrICovCisJc3IzMihDTV9JQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBJQ0tlbiBHUFQyICovCisJc3IzMihDTV9GQ0xLRU5fUEVSLCAzLCAxLCAweDEpOyAvKiBGQ0tlbiBHUFQyICovCisKKyNpZmRlZiBDRkdfTlMxNjU1MAorCS8qIEVuYWJsZSBVQVJUMSBjbG9ja3MgKi8KKwlzcjMyKENNX0ZDTEtFTjFfQ09SRSwgMTMsIDEsIDB4MSk7CisJc3IzMihDTV9JQ0xLRU4xX0NPUkUsIDEzLCAxLCAweDEpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTU1DCisJLyogRW5hYmxlIE1NQzEgY2xvY2tzICovCisJc3IzMihDTV9GQ0xLRU4xX0NPUkUsIDI0LCAxLCAweDEpOworCXNyMzIoQ01fSUNMS0VOMV9DT1JFLCAyNCwgMSwgMHgxKTsKKyNlbmRpZgorCWRlbGF5KDEwMDApOworfQorCisvKiBTZXQgTVVYIGZvciBVQVJULCBHUE1DLCBTRFJDLCBHUElPICovCisKKy8qCisgKiBJRU4gIC0gSW5wdXQgRW5hYmxlCisgKiBJRElTIC0gSW5wdXQgRGlzYWJsZQorICogUFREICAtIFB1bGwgdHlwZSBEb3duCisgKiBQVFUgIC0gUHVsbCB0eXBlIFVwCisgKiBESVMgIC0gUHVsbCB0eXBlIHNlbGVjdGlvbiBpcyBpbmFjdGl2ZQorICogRU4gICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgYWN0aXZlCisgKiBNMCAgIC0gTW9kZSAwCisgKiBUaGUgY29tbWVudGVkIHN0cmluZyBnaXZlcyB0aGUgZmluYWwgbXV4IGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcGluCisgKi8KKyNkZWZpbmUgTVVYX0RFRkFVTFQoKVwKKwlNVVhfVkFMKENQKFNEUkNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxKi9cCisJTVVYX1ZBTChDUChTRFJDX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDIqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q0Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDUqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19ENiovXAorCU1VWF9WQUwoQ1AoU0RSQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0Q3Ki9cCisJTVVYX1ZBTChDUChTRFJDX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRDgqL1wKKwlNVVhfVkFMKENQKFNEUkNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMTkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QxOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyMyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjYpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjcpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyNyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjgpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMjkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QyOSovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMCovXAorCU1VWF9WQUwoQ1AoU0RSQ19EMzEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0QzMSovXAorCU1VWF9WQUwoQ1AoU0RSQ19DTEspLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0NMSyovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzAqL1wKKwlNVVhfVkFMKENQKFNEUkNfRFFTMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qU0RSQ19EUVMxKi9cCisJTVVYX1ZBTChDUChTRFJDX0RRUzIpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKlNEUkNfRFFTMiovXAorCU1VWF9WQUwoQ1AoU0RSQ19EUVMzKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTRFJDX0RRUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19BMiksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0EyKi9cCisJTVVYX1ZBTChDUChHUE1DX0EzKSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTMqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTQpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19BNSksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E1Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E2KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTYqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTcpLCAgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BNyovXAorCU1VWF9WQUwoQ1AoR1BNQ19BOCksICAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0E4Ki9cCisJTVVYX1ZBTChDUChHUE1DX0E5KSwgICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQTkqL1wKKwlNVVhfVkFMKENQKEdQTUNfQTEwKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19BMTAqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMSksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxKi9cCisJTVVYX1ZBTChDUChHUE1DX0QyKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDIqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDMpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q0Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q1KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDUqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDYpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19ENiovXAorCU1VWF9WQUwoQ1AoR1BNQ19ENyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0Q3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0Q4KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfRDgqL1wKKwlNVVhfVkFMKENQKEdQTUNfRDkpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19EOSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTApLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTEpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTIpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxMyovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTQpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNCovXAorCU1VWF9WQUwoQ1AoR1BNQ19EMTUpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypHUE1DX0QxNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MwKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzAqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTMSksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1MxKi9cCisJTVVYX1ZBTChDUChHUE1DX05DUzIpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTMiovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1MzKSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzMqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNCksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M0Ki9cCisJTVVYX1ZBTChDUChHUE1DX05DUzUpLCAgICAgIChJRElTIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfTkNTNSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQ1M2KSwgICAgICAoSURJUyB8IFBUVSB8IEVOICB8IE0wKSkgLypHUE1DX05DUzYqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkNTNyksICAgICAgKElESVMgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19OQ1M3Ki9cCisJTVVYX1ZBTChDUChHUE1DX0NMSyksICAgICAgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfQ0xLKi9cCisJTVVYX1ZBTChDUChHUE1DX05BRFZfQUxFKSwgIChJRElTIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTkFEVl9BTEUqL1wKKwlNVVhfVkFMKENQKEdQTUNfTk9FKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OT0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTldFKSwgICAgICAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OV0UqL1wKKwlNVVhfVkFMKENQKEdQTUNfTkJFMF9DTEUpLCAgKElESVMgfCBQVEQgfCBESVMgfCBNMCkpIC8qR1BNQ19OQkUwX0NMRSovXAorCU1VWF9WQUwoQ1AoR1BNQ19OQkUxKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzYxKi9cCisJTVVYX1ZBTChDUChHUE1DX05XUCksICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTApKSAvKkdQTUNfTldQKi9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQwKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTApKSAvKkdQTUNfV0FJVDAqL1wKKwlNVVhfVkFMKENQKEdQTUNfV0FJVDEpLCAgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNMCkpIC8qR1BNQ19XQUlUMSovXAorCU1VWF9WQUwoQ1AoR1BNQ19XQUlUMiksICAgICAoSUVOICB8IFBUVSB8IEVOICB8IE00KSkgLypHUElPXzY0Ki9cCisJTVVYX1ZBTChDUChHUE1DX1dBSVQzKSwgICAgIChJRU4gIHwgUFRVIHwgRU4gIHwgTTQpKSAvKkdQSU9fNjUqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMTgpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT184OCovXAorCU1VWF9WQUwoQ1AoRFNTX0RBVEExOSksICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzg5Ki9cCisJTVVYX1ZBTChDUChEU1NfREFUQTIwKSwgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOTAqL1wKKwlNVVhfVkFMKENQKERTU19EQVRBMjEpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT185MSovXAorCU1VWF9WQUwoQ1AoQ0FNX1dFTiksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE2NyovXAorCU1VWF9WQUwoQ1AoVUFSVDFfVFgpLCAgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9UWCovXAorCU1VWF9WQUwoQ1AoVUFSVDFfUlRTKSwgICAgICAoSURJUyB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX0NUUyksICAgICAgKElFTiB8IFBUVSB8IERJUyB8IE0wKSkgLypVQVJUMV9DVFMqL1wKKwlNVVhfVkFMKENQKFVBUlQxX1JYKSwgICAgICAgKElFTiB8IFBURCB8IERJUyB8IE0wKSkgLypVQVJUMV9SWCovXAorCU1VWF9WQUwoQ1AoTUNCU1AxX0RYKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE1OCovXAorCU1VWF9WQUwoQ1AoU1lTXzMySyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypTWVNfMzJLKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDApLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMiAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18zICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1QyKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzQgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDMpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fNSAqL1wKKwlNVVhfVkFMKENQKFNZU19CT09UNCksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT182ICovXAorCU1VWF9WQUwoQ1AoU1lTX0JPT1Q1KSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzcgKi9cCisJTVVYX1ZBTChDUChTWVNfQk9PVDYpLCAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fOCAqL1wKKwlNVVhfVkFMKENQKFNZU19DTEtPVVQyKSwgICAgKElFTiAgfCBQVFUgfCBFTiAgfCBNNCkpIC8qR1BJT18xODYqL1wKKwlNVVhfVkFMKENQKEpUQUdfblRSU1QpLCAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19uVFJTVCovXAorCU1VWF9WQUwoQ1AoSlRBR19UQ0spLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RDSyovXAorCU1VWF9WQUwoQ1AoSlRBR19UTVMpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RNUyovXAorCU1VWF9WQUwoQ1AoSlRBR19UREkpLCAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX1RESSovXAorCU1VWF9WQUwoQ1AoSlRBR19FTVUwKSwgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE0wKSkgLypKVEFHX0VNVTAqL1wKKwlNVVhfVkFMKENQKEpUQUdfRU1VMSksICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNMCkpIC8qSlRBR19FTVUxKi9cCisJTVVYX1ZBTChDUChFVEtfQ0xLKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTIqL1wKKwlNVVhfVkFMKENQKEVUS19DVEwpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xMyovXAorCU1VWF9WQUwoQ1AoRVRLX0QwICksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzE0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDEgKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMTUqL1wKKwlNVVhfVkFMKENQKEVUS19EMiApLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18xNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMCksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI0Ki9cCisJTVVYX1ZBTChDUChFVEtfRDExKSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjUqL1wKKwlNVVhfVkFMKENQKEVUS19EMTIpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yNiovXAorCU1VWF9WQUwoQ1AoRVRLX0QxMyksICAgICAgICAoSUVOICB8IFBURCB8IERJUyB8IE00KSkgLypHUElPXzI3Ki9cCisJTVVYX1ZBTChDUChFVEtfRDE0KSwgICAgICAgIChJRU4gIHwgUFREIHwgRElTIHwgTTQpKSAvKkdQSU9fMjgqL1wKKwlNVVhfVkFMKENQKEVUS19EMTUpLCAgICAgICAgKElFTiAgfCBQVEQgfCBESVMgfCBNNCkpIC8qR1BJT18yOSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSb3V0aW5lOiBzZXRfbXV4Y29uZl9yZWdzCisgKiBEZXNjcmlwdGlvbjogU2V0dGluZyB1cCB0aGUgY29uZmlndXJhdGlvbiBNdXggcmVnaXN0ZXJzCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGhhcmR3YXJlLiBNYW55IHBpbnMgbmVlZAorICogICAgICAgICAgICAgIHRvIGJlIG1vdmVkIGZyb20gcHJvdGVjdCB0byBwcmltYXJ5IG1vZGUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpCit7CisJTVVYX0RFRkFVTFQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IG5hbmQrX2luaXQKKyAqIERlc2NyaXB0aW9uOiBTZXQgdXAgbmFuZCBmb3IgbmFuZCBhbmQgamZmczIgY29tbWFuZHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBuYW5kX2luaXQodm9pZCkKK3sKKwkvKiBnbG9iYWwgc2V0dGluZ3MgKi8KKwlfX3Jhd193cml0ZWwoMHgxMCwgR1BNQ19TWVNDT05GSUcpOwkvKiBzbWFydCBpZGxlICovCisJX19yYXdfd3JpdGVsKDB4MCwgR1BNQ19JUlFFTkFCTEUpOwkvKiBpc3IncyBzb3VyY2VzIG1hc2tlZCAqLworCV9fcmF3X3dyaXRlbCgwLCBHUE1DX1RJTUVPVVRfQ09OVFJPTCk7LyogdGltZW91dCBkaXNhYmxlICovCisKKwkvKiBTZXQgdGhlIEdQTUMgVmFscyAuIEZvciBOQU5EIGJvb3Qgb24gMzQzMFNEUCwgTkFORCBpcyBtYXBwZWQgYXQgQ1MwCisgICAgICAgICAqICAsIE5PUiBhdCBDUzEgYW5kIE1QREIgYXQgQ1MzLiBBbmQgb25lTkFORCBib290LCB3ZSBtYXAgb25lTkFORCBhdCBDUzAuCisJICogIFdlIGNvbmZpZ3VyZSBvbmx5IEdQTUMgQ1MwIHdpdGggcmVxdWlyZWQgdmFsdWVzLiBDb25maWdpcmluZyBvdGhlciBkZXZpY2VzCisJICogIGF0IG90aGVyIENTIGluIGRvbmUgaW4gdS1ib290IGFueXdheS4gU28gd2UgZG9uJ3QgaGF2ZSB0byBib3RoZXIgZG9pbmcgaXQgaGVyZS4KKyAgICAgICAgICovCisJX19yYXdfd3JpdGVsKDAgLCBHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApOworCWRlbGF5KDEwMDApOworCisJaWYgKChnZXRfbWVtX3R5cGUoKSA9PSBHUE1DX05BTkQpIHx8IChnZXRfbWVtX3R5cGUoKSA9PSBNTUNfTkFORCkpeworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcxLCBHUE1DX0NPTkZJRzEgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUczLCBHUE1DX0NPTkZJRzMgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc0LCBHUE1DX0NPTkZJRzQgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBNX05BTkRfR1BNQ19DT05GSUc2LCBHUE1DX0NPTkZJRzYgKyBHUE1DX0NPTkZJR19DUzApOworCisgICAgICAgIAkvKiBFbmFibGUgdGhlIEdQTUMgTWFwcGluZyAqLworICAgICAgICAJX19yYXdfd3JpdGVsKCggKChPTUFQMzRYWF9HUE1DX0NTMF9TSVpFICYgMHhGKTw8OCkgfAorICAgICAgICAJCSAgICAgKChOQU5EX0JBU0VfQURSPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgICAJaWYgKG5hbmRfY2hpcCgpKXsKKyNpZmRlZiBDRkdfUFJJTlRGCisgICAgICAgIAkJcHJpbnRmKCJVbnN1cHBvcnRlZCBDaGlwIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKworCX0KKworCWlmICgoZ2V0X21lbV90eXBlKCkgPT0gR1BNQ19PTkVOQU5EKSB8fCAoZ2V0X21lbV90eXBlKCkgPT0gTU1DX09ORU5BTkQpKXsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzEsIEdQTUNfQ09ORklHMSArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUcyLCBHUE1DX0NPTkZJRzIgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHMywgR1BNQ19DT05GSUczICsgR1BNQ19DT05GSUdfQ1MwKTsKKyAgICAgICAgCV9fcmF3X3dyaXRlbCggT05FTkFORF9HUE1DX0NPTkZJRzQsIEdQTUNfQ09ORklHNCArIEdQTUNfQ09ORklHX0NTMCk7CisgICAgICAgIAlfX3Jhd193cml0ZWwoIE9ORU5BTkRfR1BNQ19DT05GSUc1LCBHUE1DX0NPTkZJRzUgKyBHUE1DX0NPTkZJR19DUzApOworICAgICAgICAJX19yYXdfd3JpdGVsKCBPTkVOQU5EX0dQTUNfQ09ORklHNiwgR1BNQ19DT05GSUc2ICsgR1BNQ19DT05GSUdfQ1MwKTsKKworICAgICAgICAJLyogRW5hYmxlIHRoZSBHUE1DIE1hcHBpbmcgKi8KKyAgICAgICAgCV9fcmF3X3dyaXRlbCgoICgoT01BUDM0WFhfR1BNQ19DUzBfU0laRSAmIDB4Rik8PDgpIHwKKyAgICAgICAgCQkgICAgICgoT05FTkFORF9CQVNFPj4yNCkgJiAweDNGKSB8CisgICAgICAgIAkJICAgICAoMTw8NikgKSwgIChHUE1DX0NPTkZJRzcgKyBHUE1DX0NPTkZJR19DUzApKTsKKyAgICAgICAgCWRlbGF5KDIwMDApOworCisgICAgICAgIAlpZiAob25lbmFuZF9jaGlwKCkpeworI2lmZGVmIENGR19QUklOVEYKKyAgICAgICAgCQlwcmludGYoIk9uZU5BTkQgVW5zdXBwb3J0ZWQgIVxuIik7CisjZW5kaWYKKyAgICAgICAgCQlyZXR1cm4gMTsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBpbnQgKG1tY19ib290X2FkZHIpICh2b2lkKTsKK2ludCBtbWNfYm9vdCh1bnNpZ25lZCBjaGFyICpidWYpCit7CisKKyAgICAgICBsb25nIHNpemUgPSAwOworI2lmZGVmIENGR19DTURfRkFUCisgICAgICAgYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MgPSBOVUxMOworICAgICAgIHVuc2lnbmVkIGNoYXIgcmV0ID0gMDsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgWC1sb2FkZXIgb24gTU1DXG4iKTsKKworICAgICAgIHJldCA9IG1tY19pbml0KDEpOworICAgICAgIGlmKHJldCA9PSAwKXsKKyAgICAgICAgICAgICAgIHByaW50ZigiXG4gTU1DIGluaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgIH0KKworICAgICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoMCk7CisgICAgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgMSk7CisgICAgICAgc2l6ZSA9IGZpbGVfZmF0X3JlYWQoInUtYm9vdC5iaW4iLCBidWYsIDApOworICAgICAgIGlmIChzaXplID09IC0xKSB7CisgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJcbiVsZCBCeXRlcyBSZWFkIGZyb20gTU1DXG4iLCBzaXplKTsKKworICAgICAgIHByaW50ZigiU3RhcnRpbmcgT1MgQm9vdGxvYWRlciBmcm9tIE1NQy4uLlxuIik7CisjZW5kaWYKKyAgICAgICByZXR1cm4gc2l6ZTsKK30KKworLyogb3B0aW9uYWxseSBkbyBzb21ldGhpbmcgbGlrZSBibGlua2luZyBMRUQgKi8KK3ZvaWQgYm9hcmRfaGFuZyAodm9pZCkKK3sgd2hpbGUgKDApIHt9O30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3BsYXRmb3JtLlMgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9wbGF0Zm9ybS5TCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczYTNjNDgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS9wbGF0Zm9ybS5TCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQm9hcmQgc3BlY2lmaWMgc2V0dXAgaW5mbworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2Nrcy5oPgorCitfVEVYVF9CQVNFOgorCS53b3JkCVRFWFRfQkFTRQkvKiBzZHJhbSBsb2FkIGFkZHIgZnJvbSBjb25maWcubWsgKi8KKworI2lmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpICYmICFkZWZpbmVkKENGR19OQU5EX0JPT1QpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGNweV9jbGtfY29kZTogcmVsb2NhdGVzIGNsb2NrIGNvZGUgaW50byBTUkFNIHdoZXJlIGl0cyBzYWZlciB0byBleGVjdXRlCisgKiBSMSA9IFNSQU0gZGVzdGluYXRpb24gYWRkcmVzcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLmdsb2JhbCBjcHlfY2xrX2NvZGUKKyBjcHlfY2xrX2NvZGU6CisgICAgICAgIC8qIENvcHkgRFBMTCBjb2RlIGludG8gU1JBTSAqLworICAgICAgICBhZHIgICAgIHIwLCBnb190b19zcGVlZCAgICAgICAgIC8qIGdldCBhZGRyIG9mIGNsb2NrIHNldHRpbmcgY29kZSAqLworICAgICAgICBtb3YgICAgIHIyLCAjMzg0ICAgICAgICAgICAgICAgIC8qIHIyIHNpemUgdG8gY29weSAoZGl2IGJ5IDMyIGJ5dGVzKSAqLworICAgICAgICBtb3YgICAgIHIxLCByMSAgICAgICAgICAgICAgICAgIC8qIHIxIDwtIGRlc3QgYWRkcmVzcyAocGFzc2VkIGluKSAqLworICAgICAgICBhZGQgICAgIHIyLCByMiwgcjAgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAqLworbmV4dDI6CisgICAgICAgIGxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKyAgICAgICAgc3RtaWEgICByMSEsIHtyMy1yMTB9ICAgICAgICAgICAvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLworICAgICAgICBjbXAgICAgIHIwLCByMiAgICAgICAgICAgICAgICAgIC8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisgICAgICAgIGJuZSAgICAgbmV4dDIKKwltb3YJcGMsIGxyICAgICAgICAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogMzQzMCBYLWxvYWRlciBjdXJyZW50bHkgZG9lcyBub3QgdXNlIHRoaXMgY29kZS4KKyogICBJdCBjb3VsZCBiZSByZW1vdmVkIGl0cyBpcyBrZXB0IGZvciBjb21wYXRhYmlseSB3aXRoIHUtYm9vdC4KKyAqCisgKiAgZ29fdG9fc3BlZWQ6IC1Nb3ZlcyB0byBieXBhc3MsIC1Db21taXRzIGNsb2NrIGRpdmlkZXJzLCAtcHV0cyBkcGxsIGF0IHNwZWVkCisgKiAgICAgICAgICAgICAgIC1leGVjdXRlZCBmcm9tIFNSQU0uCisgKiAgUjAgPSBDTV9DTEtFTl9QTEwtYnlwYXNzIHZhbHVlCisgKiAgUjEgPSBDTV9DTEtTRUwxX1BMTC1tLCBuLCBhbmQgZGl2aWRlciB2YWx1ZXMKKyAqICBSMiA9IENNX0NMS1NFTF9DT1JFLWRpdmlkZXIgdmFsdWVzCisgKiAgUjMgPSBDTV9JRExFU1RfQ0tHRU4gLSBhZGRyIGRwbGwgbG9jayB3YWl0CisgKgorICogIE5vdGU6IElmIGNvcmUgdW5sb2Nrcy9yZWxvY2tzIGFuZCBTRFJBTSBpcyBydW5uaW5nIGZhc3QgYWxyZWFkeSBpdCBnZXRzCisgKiAgICAgICAgY29uZnVzZWQuICBBIHJlc2V0IG9mIHRoZSBjb250cm9sbGVyIGdldHMgaXQgYmFjay4gIFRha2luZyBhd2F5IGl0cworICogICAgICAgIEwzIHdoZW4gaXRzIG5vdCBpbiBzZWxmIHJlZnJlc2ggc2VlbXMgYmFkIGZvciBpdC4gIE5vcm1hbGx5LCB0aGlzIGNvZGUKKyAqICAgICAgICBydW5zIGZyb20gZmxhc2ggYmVmb3JlIFNEUiBpcyBpbml0IHNvIHRoYXQgc2hvdWxkIGJlIG9rLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy5nbG9iYWwgZ29fdG9fc3BlZWQKKyBnb190b19zcGVlZDoKKyAgICAgICAgc3RtZmQgc3AhLCB7cjQtcjZ9CisKKyAgICAgICAgLyogbW92ZSBpbnRvIGZhc3QgcmVsb2NrIGJ5cGFzcyAqLworICAgICAgICBsZHIgICAgIHI0LCBwbGxfY3RsX2FkZAorICAgICAgICBzdHIgICAgIHIwLCBbcjRdCit3YWl0MToKKyAgICAgICAgbGRyICAgICByNSwgW3IzXSAgICAgICAvKiBnZXQgc3RhdHVzICovCisgICAgICAgIGFuZCAgICAgcjUsIHI1LCAjMHgxICAgLyogaXNvbGF0ZSBjb3JlIHN0YXR1cyAqLworICAgICAgICBjbXAgICAgIHI1LCAjMHgxICAgICAgIC8qIHN0aWxsIGxvY2tlZD8gKi8KKyAgICAgICAgYmVxICAgICB3YWl0MSAgICAgICAgICAvKiBpZiBsb2NrLCBsb29wICovCisKKwkvKiBzZXQgbmV3IGRwbGwgZGl2aWRlcnMgX2FmdGVyXyBpbiBieXBhc3MgKi8KKwlsZHIgICAgIHI1LCBwbGxfZGl2X2FkZDEKKyAgICAgICAgc3RyICAgICByMSwgW3I1XSAgICAgICAgICAvKiBzZXQgbSwgbiwgbTIgKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQyCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0gICAgICAgICAgLyogc2V0IGwzL2w0Ly4uIGRpdmlkZXJzKi8KKyAgICAgICAgbGRyICAgICByNSwgcGxsX2Rpdl9hZGQzICAvKiB3a3VwICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsMyAgLyogcnNtIHZhbCAqLworICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNCAgLyogZ2Z4ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNAorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisgICAgICAgIGxkciAgICAgcjUsIHBsbF9kaXZfYWRkNSAgLyogZW11ICovCisgICAgICAgIGxkciAgICAgcjIsIHBsbF9kaXZfdmFsNQorICAgICAgICBzdHIgICAgIHIyLCBbcjVdCisKKyAgICAgICAgLyogbm93IHByZXBhcmUgR1BNQyAoZmxhc2gpIGZvciBuZXcgZHBsbCBzcGVlZCAqLworCS8qIGZsYXNoIG5lZWRzIHRvIGJlIHN0YWJsZSB3aGVuIHdlIGp1bXAgYmFjayB0byBpdCAqLworICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmczX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnM192YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc0X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNF92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmc1X2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgZmxhc2hfY2ZnNV92YWwKKyAgICAgICAgc3RyICAgICByMiwgW3I1XQorICAgICAgICBsZHIgICAgIHI1LCBmbGFzaF9jZmcxX2FkZHIKKyAgICAgICAgbGRyICAgICByMiwgW3I1XQorICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4MyAgICAgLyogdXAgZ3BtYyBkaXZpZGVyICovCisgICAgICAgIHN0ciAgICAgcjIsIFtyNV0KKworICAgICAgICAvKiBsb2NrIERQTEwzIGFuZCB3YWl0IGEgYml0ICovCisgICAgICAgIG9yciAgICAgcjAsIHIwLCAjMHg3ICAgLyogc2V0IHVwIGZvciBsb2NrIG1vZGUgKi8KKyAgICAgICAgc3RyICAgICByMCwgW3I0XSAgICAgICAvKiBsb2NrICovCisgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgLyogQVJNIHNsb3cgYXQgdGhpcyBwb2ludCB3b3JraW5nIGF0IHN5c19jbGsgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKK3dhaXQyOgorICAgICAgICBsZHIgICAgIHI1LCBbcjNdICAgICAgIC8qIGdldCBzdGF0dXMgKi8KKyAgICAgICAgYW5kICAgICByNSwgcjUsICMweDEgICAvKiBpc29sYXRlIGNvcmUgc3RhdHVzICovCisgICAgICAgIGNtcCAgICAgcjUsICMweDEgICAgICAgLyogc3RpbGwgbG9ja2VkPyAqLworICAgICAgICBibmUgICAgIHdhaXQyICAgICAgICAgIC8qIGlmIGxvY2ssIGxvb3AgKi8KKyAgICAgICAgbm9wCisgICAgICAgIG5vcAorICAgICAgICBub3AKKyAgICAgICAgbm9wCisgICAgICAgIGxkbWZkIHNwISwge3I0LXI2fQorICAgICAgICBtb3YgICAgIHBjLCBsciAgICAgICAgICAgLyogYmFjayB0byBjYWxsZXIsIGxvY2tlZCAqLworCitfZ29fdG9fc3BlZWQ6IC53b3JkIGdvX3RvX3NwZWVkCisKKy8qIHRoZXNlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGNsb3NlIGZvciBQSUMgY29kZSAqLworLyogVGhlIE5vciBoYXMgdG8gYmUgaW4gdGhlIEZsYXNoIEJhc2UgQ1MwIGZvciB0aGlzIGNvbmRpdGlvbiB0byBoYXBwZW4gKi8KK2ZsYXNoX2NmZzFfYWRkcjoKKyAgICAud29yZCAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUcxKQorZmxhc2hfY2ZnM19hZGRyOgorICAgIC53b3JkICAoR1BNQ19DT05GSUdfQ1MwICsgR1BNQ19DT05GSUczKQorZmxhc2hfY2ZnM192YWw6CisgICAgLndvcmQgIFNUTk9SX0dQTUNfQ09ORklHMworZmxhc2hfY2ZnNF9hZGRyOgorICAgIC53b3JkIChHUE1DX0NPTkZJR19DUzAgKyBHUE1DX0NPTkZJRzQpCitmbGFzaF9jZmc0X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc0CitmbGFzaF9jZmc1X3ZhbDoKKyAgICAud29yZCAgU1ROT1JfR1BNQ19DT05GSUc1CitmbGFzaF9jZmc1X2FkZHI6CisgICAgLndvcmQgKEdQTUNfQ09ORklHX0NTMCArIEdQTUNfQ09ORklHNSkKK3BsbF9jdGxfYWRkOgorICAgIC53b3JkIENNX0NMS0VOX1BMTAorcGxsX2Rpdl9hZGQxOgorICAgIC53b3JkIENNX0NMS1NFTDFfUExMCitwbGxfZGl2X2FkZDI6CisgICAgLndvcmQgQ01fQ0xLU0VMX0NPUkUKK3BsbF9kaXZfYWRkMzoKKyAgICAud29yZCBDTV9DTEtTRUxfV0tVUAorcGxsX2Rpdl92YWwzOgorICAgIC53b3JkIChXS1VQX1JTTSA8PCAxKQorcGxsX2Rpdl9hZGQ0OgorICAgIC53b3JkIENNX0NMS1NFTF9HRlgKK3BsbF9kaXZfdmFsNDoKKyAgICAud29yZCAoR0ZYX0RJViA8PCAwKQorcGxsX2Rpdl9hZGQ1OgorICAgIC53b3JkIENNX0NMS1NFTDFfRU1VCitwbGxfZGl2X3ZhbDU6CisgICAgLndvcmQgQ0xTRUwxX0VNVV9WQUwKKworI2VuZGlmCisKKy5nbG9ibCBsb3dsZXZlbF9pbml0Citsb3dsZXZlbF9pbml0OgorCWxkcglzcCwJU1JBTV9TVEFDSworICAgICAgICBzdHIgICAgIGlwLAlbc3BdICAgIC8qIHN0YXNoIG9sZCBsaW5rIHJlZ2lzdGVyICovCisJbW92CWlwLAlscgkvKiBzYXZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisgICAgICAgIGJsICAgICAgc19pbml0ICAgICAgICAgIC8qIGdvIHNldHVwIHBsbCxtdXgsbWVtb3J5ICovCisgICAgICAgIGxkciAgICAgaXAsCVtzcF0gICAgLyogcmVzdG9yZSBzYXZlIGlwICovCisJbW92CWxyLAlpcAkvKiByZXN0b3JlIGxpbmsgcmVnICovCisKKwkvKiBiYWNrIHRvIGFyY2ggY2FsbGluZyBjb2RlICovCisJbW92CXBjLAlscgorCisJLyogdGhlIGxpdGVyYWwgcG9vbHMgb3JpZ2luICovCisJLmx0b3JnCisKK1JFR19DT05UUk9MX1NUQVRVUzoKKwkud29yZCBDT05UUk9MX1NUQVRVUworU1JBTV9TVEFDSzoKKwkud29yZCBMT1dfTEVWRUxfU1JBTV9TVEFDSworCisKKy8qIERQTEwoMS00KSBQQVJBTSBUQUJMRVMgKi8KKy8qIEVhY2ggb2YgdGhlIHRhYmxlcyBoYXMgTSwgTiwgRlJFUVNFTCwgTTIgdmFsdWVzIGRlZmluZWQgZm9yIG5vbWluYWwKKyAqIE9QUCAoMS4yVikuIFRoZSBmaWVsZHMgYXJlIGRlZmluZWQgYWNjb3JkaW5nIHRvIGRwbGxfcGFyYW0gc3RydWN0KGNsb2NrLmMpLgorICogVGhlIHZhbHVlcyBhcmUgZGVmaW5lZCBmb3IgYWxsIHBvc3NpYmxlIHN5c2NsayBhbmQgZm9yIEVTMSBhbmQgRVMyLgorICovCisKK21wdV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDUKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxN0QKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxRjQKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3OQorLndvcmQgMHgxMgorLndvcmQgMHgwNAorLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDI3MQorLndvcmQgMHgxNworLndvcmQgMHgwMworLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDE3RAorLndvcmQgMHgxOQorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBGQQorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUZBCisud29yZCAweDMyCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MjcxCisud29yZCAweDJGCisud29yZCAweDAzCisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9tcHVfZHBsbF9wYXJhbQorZ2V0X21wdV9kcGxsX3BhcmFtOgorCWFkciByMCwgbXB1X2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2l2YV9kcGxsX3BhcmFtOgorLyogMTJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwN0QKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQjQKKy53b3JkIDB4MDUKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMTNNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgwRkEKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxNjgKKy53b3JkIDB4MEMKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMTkuMk1IeiAqLworLyogRVMxICovCisud29yZCAweDA4MgorLndvcmQgMHgwOQorLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBFMQorLndvcmQgMHgwQgorLndvcmQgMHgwNgorLndvcmQgMHgwMQorCisvKiAyNk1IeiAqLworLyogRVMxICovCisud29yZCAweDA3RAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDBCNAorLndvcmQgMHgwQworLndvcmQgMHgwNworLndvcmQgMHgwMQorCisvKiAzOC40TUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTNGCisud29yZCAweDMwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEUxCisud29yZCAweDE3Cisud29yZCAweDA2Cisud29yZCAweDAxCisKKworLmdsb2JsIGdldF9pdmFfZHBsbF9wYXJhbQorZ2V0X2l2YV9kcGxsX3BhcmFtOgorCWFkciByMCwgaXZhX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKK2NvcmVfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MTlGCisud29yZCAweDBFCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MEE2Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDAxCisKKy8qIDEzTUh6ICovCisvKiBFUzEgKi8KKy53b3JkIDB4MUIyCisud29yZCAweDEwCisud29yZCAweDAzCisud29yZCAweDAxCisvKiBFUzIgKi8KKy53b3JkIDB4MTRDCisud29yZCAweDBDCisud29yZCAweDAzCisud29yZCAweDAxCisKKy8qIDE5LjJNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgxOUYKKy53b3JkIDB4MTcKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKworLyogMjZNSHogKi8KKy8qIEVTMSAqLworLndvcmQgMHgxQjIKKy53b3JkIDB4MjEKKy53b3JkIDB4MDMKKy53b3JkIDB4MDEKKy8qIEVTMiAqLworLndvcmQgMHgwQTYKKy53b3JkIDB4MEMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDEKKworLyogMzguNE1IeiAqLworLyogRVMxICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorLyogRVMyICovCisud29yZCAweDE5RgorLndvcmQgMHgyRgorLndvcmQgMHgwMworLndvcmQgMHgwMQorCisuZ2xvYmwgZ2V0X2NvcmVfZHBsbF9wYXJhbQorZ2V0X2NvcmVfZHBsbF9wYXJhbToKKwlhZHIgcjAsIGNvcmVfZHBsbF9wYXJhbQorCW1vdiBwYywgbHIKKworLyogUEVSIERQTEwgdmFsdWVzIGFyZSBzYW1lIGZvciBib3RoIEVTMSBhbmQgRVMyICovCitwZXJfZHBsbF9wYXJhbToKKy8qIDEyTUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDA1Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDEzTUh6ICovCisud29yZCAweDFCMAorLndvcmQgMHgwQworLndvcmQgMHgwMworLndvcmQgMHgwOQorCisvKiAxOS4yTUh6ICovCisud29yZCAweEUxCisud29yZCAweDA5Cisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDI2TUh6ICovCisud29yZCAweEQ4Cisud29yZCAweDBDCisud29yZCAweDA3Cisud29yZCAweDA5CisKKy8qIDM4LjRNSHogKi8KKy53b3JkIDB4RTEKKy53b3JkIDB4MTMKKy53b3JkIDB4MDcKKy53b3JkIDB4MDkKKworLmdsb2JsIGdldF9wZXJfZHBsbF9wYXJhbQorZ2V0X3Blcl9kcGxsX3BhcmFtOgorCWFkciByMCwgcGVyX2RwbGxfcGFyYW0KKwltb3YgcGMsIGxyCisKKy8qCisgKiBUYWJsZXMgZm9yIDM2eC8zN3ggZGV2aWNlcworICoKKyAqIChQb3B1bGF0ZWQgZm9yIDEzTUh6IG9ubHkpCisgKi8KK21wdV8zNnhfZHBsbF9wYXJhbToKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKy53b3JkIDMwMCwgMTIsIDAsIDEKKworaXZhXzM2eF9kcGxsX3BhcmFtOgorLndvcmQgMTAsIDAsIDAsIDEKKy53b3JkIDEwLCAwLCAwLCAxCisud29yZCAxMCwgMCwgMCwgMQorLndvcmQgMTAsIDAsIDAsIDEKKworY29yZV8zNnhfZHBsbF9wYXJhbToKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKy53b3JkIDIwMCwgMTIsIDAsIDEKKworcGVyXzM2eF9kcGxsX3BhcmFtOgorLyogICAgU1lTQ0xLICAgICBNICAgICAgTiAgICAgIE0yICAgICAgTTMgICAgICBNNCAgICAgTTUgICAgICBNNiAgICAgIG0yRElWICovCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorLndvcmQgMjYwMDAsICAgIDQzMiwgICAxMiwgICAgIDksICAgICAgMTYsICAgICA5LCAgICAgNCwgICAgICAzLCAgICAgIDEKKy53b3JkIDI2MDAwLCAgICA0MzIsICAgMTIsICAgICA5LCAgICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAgMywgICAgICAxCisud29yZCAyNjAwMCwgICAgNDMyLCAgIDEyLCAgICAgOSwgICAgICAxNiwgICAgIDksICAgICA0LCAgICAgIDMsICAgICAgMQorCisuZ2xvYmwgZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbQorZ2V0XzM2eF9tcHVfZHBsbF9wYXJhbToKKwlhZHIJcjAsIG1wdV8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKKworLmdsb2JsIGdldF8zNnhfaXZhX2RwbGxfcGFyYW0KK2dldF8zNnhfaXZhX2RwbGxfcGFyYW06CisJYWRyCXIwLCBpdmFfMzZ4X2RwbGxfcGFyYW0KKwltb3YJcGMsIGxyCisKKy5nbG9ibCBnZXRfMzZ4X2NvcmVfZHBsbF9wYXJhbQorZ2V0XzM2eF9jb3JlX2RwbGxfcGFyYW06CisJYWRyCXIwLCBjb3JlXzM2eF9kcGxsX3BhcmFtCisJbW92CXBjLCBscgorCisuZ2xvYmwgZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbQorZ2V0XzM2eF9wZXJfZHBsbF9wYXJhbToKKwlhZHIJcjAsIHBlcl8zNnhfZHBsbF9wYXJhbQorCW1vdglwYywgbHIKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2JvYXJkL29tYXAzZXZtL3gtbG9hZC5sZHMgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS94LWxvYWQubGRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVmMzUyZDMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9ib2FyZC9vbWFwM2V2bS94LWxvYWQubGRzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBOb3ZlbWJlciAyMDA2IC0gQ2hhbmdlZCB0byBzdXBwb3J0IDM0MzBzZHAgZGV2aWNlCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1saXR0bGVhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKK0VOVFJZKF9zdGFydCkKK1NFQ1RJT05TCit7CisJLiA9IDB4MDAwMDAwMDA7CisKKwkuID0gQUxJR04oNCk7CisJLnRleHQgICAgICA6CisJeworCSAgY3B1L29tYXAzL3N0YXJ0Lm8JKC50ZXh0KQorCSAgKigudGV4dCkKKwl9CisKKwkuID0gQUxJR04oNCk7CisJLnJvZGF0YSA6IHsgKigucm9kYXRhKSB9CisKKwkuID0gQUxJR04oNCk7CisJLmRhdGEgOiB7ICooLmRhdGEpIH0KKworCS4gPSBBTElHTig0KTsKKwkuZ290IDogeyAqKC5nb3QpIH0KKworCS4gPSBBTElHTig0KTsKKwlfX2Jzc19zdGFydCA9IC47CisJLmJzcyA6IHsgKiguYnNzKSB9CisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9ib2FyZHMuY2ZnIGIveC1sb2FkZXIvYm9hcmRzLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBhOTIxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvYm9hcmRzLmNmZwpAQCAtMCwwICsxLDI2IEBACisjCisjIExpc3Qgb2YgYm9hcmRzCisjCisjIFN5bnRheDoKKyMgICAgICAgIHdoaXRlLXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGVudHJpZXM7CisjICAgICAgICBlYWNoIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyMKKyMgICAgICAgIFRhcmdldG5hbWUgIEFyY2hpdGVjdHVyZSAgQ1BVICBCb2FyZG5hbWUgIFZlbmRvciAgU29DCisjCisjICAgICAgICBVbnVzZWQgZmllbGRzIGNhbiBiZSBzcGVjaWZpZWQgYXMgIi0iLCBvciBvbWl0dGVkIGlmIHRoZXkKKyMgICAgICAgIGFyZSB0aGUgbGFzdCBmaWVsZCBvbiB0aGUgbGluZS4KKyMKKyMgICAgICAgIExpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgICAgICAgIEJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgorIworIyBUbyBrZWVwIHRoZSBsaXN0IHNvcnRlZCwgdXNlIHNvbWV0aGluZyBsaWtlCisjCisjICAgICAgICA6LiwkISBzb3J0IC1mIC1rMiwyIC1rMywzIC1rNiw2IC1rNSw1IC1rMSwxCisjCisjIFRhcmdldCAgICAgICAgICAgIEFSQ0ggICAgICAgU29DICAgICAgICAgICAgIEJvYXJkIG5hbWUgICAgICAgIFZlbmRvciAgICAgICAgICAgICAgICBTb0MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkaWFtb25kICAgICAgICAgICAgIGFybSAgICAgICAgb21hcDMgICAgICAgICAgIGRpYW1vbmQgICAgICAgICAgIG5lc3QKK2RpYW1vbmQtdXNiLWxvYWRlciAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgZGlhbW9uZC11c2ItbG9hZGVyIG5lc3QKK2o0OSAgICAgICAgICAgICAgICAgYXJtICAgICAgICBvbWFwMyAgICAgICAgICAgajQ5ICAgICAgICAgICAgICAgbmVzdAorajQ5LXVzYi1sb2FkZXIgICAgICBhcm0gICAgICAgIG9tYXAzICAgICAgICAgICBqNDktdXNiLWxvYWRlciAgICBuZXN0CmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vTWFrZWZpbGUgYi94LWxvYWRlci9jb21tb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmNzJiYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDU0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYmNvbW1vbi5hCisKK0FPQkpTCT0KKworIyBjb3JlCitDT0JKUy15ICs9IGJvb3RtLm8KK0NPQkpTLXkgKz0gbWFpbi5vCitDT0JKUy15ICs9IGNvbnNvbGUubworQ09CSlMteSArPSBpbWFnZS5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKEFPQkpTOi5vPS5TKSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChBT0JKUykgJChDT0JKUykpCisKK0NQUEZMQUdTICs9IC1JLi4KKworYWxsOgkkKExJQikgJChBT0JKUykKKworJChMSUIpOiAkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9ib290bS5jIGIveC1sb2FkZXIvY29tbW9uL2Jvb3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiYTIyMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NvbW1vbi9ib290bS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIEdyYW50IEVyaWNrc29uIDxtYXJhdGhvbjk2QGdtYWlsLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgdGhhdCBib290IHRoZSBzZWNvbmQtc3RhZ2UKKyAqICAgICAgYm9vdCBsb2FkZXIgZnJvbSBtZW1vcnksIGluIGVpdGhlciByYXcsIGJpbmFyeSBmb3JtYXQgb3IKKyAqICAgICAgaW4gdS1ib290ICdta2ltYWdlJyBmb3JtYXQuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGJvb3RtLmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKwordHlwZWRlZiB2b2lkIChzcGwpKHZvaWQpOworCitzdGF0aWMgdm9pZCBleGVjKHVsb25nIGFkZHJlc3MsIGNvbnN0IGNoYXIgKndoYXQpCit7CisJcHJpbnRmKCJcblN0YXJ0aW5nICVzIC4uLiIsIHdoYXQpOworCisJKChzcGwgKilhZGRyZXNzKSgpOworfQorCitpbnQgYm9vdG0oY29uc3QgdWludDhfdCAqYnVmZmVyKQoreworCWludCBzdGF0dXMgPSBCT09UTV9TVEFUVVNfRkFJTFVSRTsKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBpbnQgZm9ybWF0ID0gZ2VuaW1nX2dldF9mb3JtYXQoKHZvaWQgKilidWZmZXIpOworCWNvbnN0IGltYWdlX2hlYWRlcl90ICogaGVhZGVyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopYnVmZmVyOworCisJc3dpdGNoIChmb3JtYXQpIHsKKworCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJc3RhdHVzID0gYm9vdG1faW1hZ2UoaGVhZGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCXByaW50ZigiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IEZJVCAoJWQpXG4iLCBmb3JtYXQpOworCQlicmVhazsKKworCWNhc2UgSU1BR0VfRk9STUFUX0lOVkFMSUQ6CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIG9yIGludmFsaWQgaW1hZ2UgZm9ybWF0ICglZClcbiIsIGZvcm1hdCk7CisJCWJyZWFrOworCisJfQorI2Vsc2UKKwlzdGF0dXMgPSBib290bV9iaW5hcnkoYnVmZmVyKTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkgKi8KKworCXJldHVybiAoc3RhdHVzKTsKK30KKworaW50IGJvb3RtX2JpbmFyeShjb25zdCB1aW50OF90ICpidWZmZXIpCit7CisJLyogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuLiAqLworCisJZXhlYygodWxvbmcpYnVmZmVyLCAic2Vjb25kLXN0YWdlIGJvb3QgbG9hZGVyIik7CisKKwkvKiBIb3dldmVyLCBpZiBpdCBkb2VzLCByZXR1cm4gZmFpbGVkIHN0YXR1cy4gKi8KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCitpbnQgYm9vdG1faW1hZ2UoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhlYWRlcikKK3sKKwljb25zdCBjaGFyICogZmFpbHVyZSA9IE5VTEw7CisJY29uc3QgY2hhciAqIHR5cGVfbmFtZSA9IE5VTEw7CisJdWludDMyX3QgbG9hZCwgaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbjsKKworCS8qIERpc3BsYXkgdG8gc3RhbmRhcmQgb3V0cHV0IHRoZSBpbWFnZSBjb250ZW50cy4gKi8KKworCWltYWdlX3ByaW50X2NvbnRlbnRzKGhlYWRlcik7CisKKwkvKiBWYWxpZGF0ZSB0aGUgaW1hZ2UgaGVhZGVyIGFuZCBpbWFnZSBkYXRhIENSQ3MgKi8KKworCXB1dHMoIiAgIFZlcmlmeWluZyBDaGVja3N1bSAuLi4gIik7CisKKwl7CisJCWlmICghaW1hZ2VfY2hlY2tfaGNyYyhoZWFkZXIpKSB7CisJCQlmYWlsdXJlID0gIkhlYWRlciBJbnZhbGlkXG4iOworCQkJZ290byBmYWlsOworCQl9CisKKwkJaWYgKCFpbWFnZV9jaGVja19kY3JjKGhlYWRlcikpIHsKKwkJCWZhaWx1cmUgPSAiRGF0YSBJbnZhbGlkXG4iOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcHV0cygiT0tcbiIpOworCisJLyogV2UgT05MWSBzdXBwb3J0IHVuY29tcHJlc3NlZCBBUk0gVS1Cb290IGZpcm13YXJlIGltYWdlcy4gQ2hlY2sKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCdzIHdoYXQgd2UgYXJlIGdvaW5nIHRvIGJvb3QuCisJICovCisKKwlpZiAoIWltYWdlX2NoZWNrX3R5cGUoaGVhZGVyLCBJSF9UWVBFX0ZJUk1XQVJFKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCBhIGZpcm13YXJlIGltYWdlXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCFpbWFnZV9jaGVja19vcyhoZWFkZXIsIElIX09TX1VfQk9PVCkpIHsKKwkJZmFpbHVyZSA9ICJJbWFnZSBpcyBub3QgdS1ib290IGZpcm13YXJlXG4iOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKGltYWdlX2dldF9jb21wKGhlYWRlcikgIT0gSUhfQ09NUF9OT05FKSB7CisJCWZhaWx1cmUgPSAiSW1hZ2UgaXMgY29tcHJlc3NlZFxuIjsKKwkJZ290byBmYWlsOworCX0KKworCWlmICghaW1hZ2VfY2hlY2tfdGFyZ2V0X2FyY2goaGVhZGVyKSkgeworCQlmYWlsdXJlID0gIkltYWdlIGlzIG5vdCBidWlsdCBmb3IgdGhpcyBwcm9jZXNzb3JcbiI7CisJCWdvdG8gZmFpbDsKKwl9CisKKwl0eXBlX25hbWUgPSBnZW5pbWdfZ2V0X3R5cGVfbmFtZShpbWFnZV9nZXRfdHlwZShoZWFkZXIpKTsKKworCXByaW50ZigiICAgTG9hZGluZyAlcyAuLi4gIiwgdHlwZV9uYW1lKTsKKworCXsKKwkJbG9hZCA9IGltYWdlX2dldF9sb2FkKGhlYWRlcik7CisJCWltYWdlX3N0YXJ0ID0gaW1hZ2VfZ2V0X2RhdGEoaGVhZGVyKTsKKwkJaW1hZ2VfbGVuID0gaW1hZ2VfZ2V0X2RhdGFfc2l6ZShoZWFkZXIpOworCisJCW1lbW1vdmVfd2QoKHZvaWQgKilsb2FkLCAodm9pZCAqKWltYWdlX3N0YXJ0LCBpbWFnZV9sZW4sIENIVU5LU1opOworCX0KKworCXB1dHMoIk9LXG4iKTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybi4gKi8KKworCWV4ZWMobG9hZCwgdHlwZV9uYW1lKTsKKworCS8qIEhvd2V2ZXIsIGlmIGl0IGRvZXMsIHJldHVybiBmYWlsZWQgc3RhdHVzLiAqLworCisgZmFpbDoKKwlwdXRzKGZhaWx1cmUpOworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vY29uc29sZS5jIGIveC1sb2FkZXIvY29tbW9uL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEzY2I3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY29tbW9uL2NvbnNvbGUuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBQYW9sbyBTY2FmZmFyZGksIEFJUlZFTlQgU0FNIHMucC5hIC0gUklNSU5JKElUQUxZKSwgYXJzZW5pb0B0aW4uaXQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKK3ZvaWQgcHV0cyhjb25zdCBjaGFyICpzKQoreworCXNlcmlhbF9wdXRzKHMpOworfQorCmRpZmYgLS1naXQgYS94LWxvYWRlci9jb21tb24vaW1hZ2UuYyBiL3gtbG9hZGVyL2NvbW1vbi9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MTZlOTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vaW1hZ2UuYwpAQCAtMCwwICsxLDI1NDEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDggU2VtaWhhbGYKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorCisjaWZkZWYgQ09ORklHX1NIT1dfQk9PVF9QUk9HUkVTUworI2luY2x1ZGUgPHN0YXR1c19sZWQuaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0hBU19EQVRBRkxBU0gKKyNpbmNsdWRlIDxkYXRhZmxhc2guaD4KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0xPR0JVRkZFUgorI2luY2x1ZGUgPGxvZ2J1ZmYuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkKKyNpbmNsdWRlIDxydGMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8aW1hZ2UuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkgfHwgZGVmaW5lZCAoQ09ORklHX09GX0xJQkZEVCkKKyNpbmNsdWRlIDxmZHQuaD4KKyNpbmNsdWRlIDxsaWJmZHQuaD4KKyNpbmNsdWRlIDxmZHRfc3VwcG9ydC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisjaW5jbHVkZSA8dS1ib290L21kNS5oPgorI2luY2x1ZGUgPHNoYTEuaD4KKworc3RhdGljIGludCBmaXRfY2hlY2tfcmFtZGlzayAoY29uc3Qgdm9pZCAqZml0LCBpbnQgb3Nfbm9mZnNldCwKKwkJdWludDhfdCBhcmNoLCBpbnQgdmVyaWZ5KTsKKyNlbmRpZgorCisjZWxzZQorI2luY2x1ZGUgIm1raW1hZ2UuaCIKKyNpbmNsdWRlIDx1LWJvb3QvbWQ1Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGltYWdlLmg+CisjZW5kaWYgLyogIVVTRV9IT1NUQ0MqLworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2VfYXJjaFtdID0geworCXsJSUhfQVJDSF9JTlZBTElELAlOVUxMLAkJIkludmFsaWQgQVJDSCIsCX0sCisJewlJSF9BUkNIX0FMUEhBLAkJImFscGhhIiwJIkFscGhhIiwJfSwKKwl7CUlIX0FSQ0hfQVJNLAkJImFybSIsCQkiQVJNIiwJCX0sCisJewlJSF9BUkNIX0kzODYsCQkieDg2IiwJCSJJbnRlbCB4ODYiLAl9LAorCXsJSUhfQVJDSF9JQTY0LAkJImlhNjQiLAkJIklBNjQiLAkJfSwKKwl7CUlIX0FSQ0hfTTY4SywJCSJtNjhrIiwJCSJNNjhLIiwJCX0sCisJewlJSF9BUkNIX01JQ1JPQkxBWkUsCSJtaWNyb2JsYXplIiwJIk1pY3JvQmxhemUiLAl9LAorCXsJSUhfQVJDSF9NSVBTLAkJIm1pcHMiLAkJIk1JUFMiLAkJfSwKKwl7CUlIX0FSQ0hfTUlQUzY0LAkJIm1pcHM2NCIsCSJNSVBTIDY0IEJpdCIsCX0sCisJewlJSF9BUkNIX05JT1MyLAkJIm5pb3MyIiwJIk5JT1MgSUkiLAl9LAorCXsJSUhfQVJDSF9QUEMsCQkicG93ZXJwYyIsCSJQb3dlclBDIiwJfSwKKwl7CUlIX0FSQ0hfUFBDLAkJInBwYyIsCQkiUG93ZXJQQyIsCX0sCisJewlJSF9BUkNIX1MzOTAsCQkiczM5MCIsCQkiSUJNIFMzOTAiLAl9LAorCXsJSUhfQVJDSF9TSCwJCSJzaCIsCQkiU3VwZXJIIiwJfSwKKwl7CUlIX0FSQ0hfU1BBUkMsCQkic3BhcmMiLAkiU1BBUkMiLAl9LAorCXsJSUhfQVJDSF9TUEFSQzY0LAkic3BhcmM2NCIsCSJTUEFSQyA2NCBCaXQiLAl9LAorCXsJSUhfQVJDSF9CTEFDS0ZJTiwJImJsYWNrZmluIiwJIkJsYWNrZmluIiwJfSwKKwl7CUlIX0FSQ0hfQVZSMzIsCQkiYXZyMzIiLAkiQVZSMzIiLAl9LAorCXsJLTEsCQkJIiIsCQkiIiwJCX0sCit9OworCitzdGF0aWMgdGFibGVfZW50cnlfdCB1aW1hZ2Vfb3NbXSA9IHsKKwl7CUlIX09TX0lOVkFMSUQsCU5VTEwsCQkiSW52YWxpZCBPUyIsCQl9LAorCXsJSUhfT1NfTElOVVgsCSJsaW51eCIsCSJMaW51eCIsCQl9LAorI2lmIGRlZmluZWQoQ09ORklHX0xZTlhLREkpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX0xZTlhPUywJImx5bnhvcyIsCSJMeW54T1MiLAkJfSwKKyNlbmRpZgorCXsJSUhfT1NfTkVUQlNELAkibmV0YnNkIiwJIk5ldEJTRCIsCQl9LAorCXsJSUhfT1NfUlRFTVMsCSJydGVtcyIsCSJSVEVNUyIsCQl9LAorCXsJSUhfT1NfVV9CT09ULAkidS1ib290IiwJIlUtQm9vdCIsCQl9LAorI2lmIGRlZmluZWQoQ09ORklHX0NNRF9FTEYpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKKwl7CUlIX09TX1FOWCwJInFueCIsCQkiUU5YIiwJCQl9LAorCXsJSUhfT1NfVlhXT1JLUywJInZ4d29ya3MiLAkiVnhXb3JrcyIsCQl9LAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSU5URUdSSVRZKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJewlJSF9PU19JTlRFR1JJVFksImludGVncml0eSIsCSJJTlRFR1JJVFkiLAkJfSwKKyNlbmRpZgorI2lmZGVmIFVTRV9IT1NUQ0MKKwl7CUlIX09TXzRfNEJTRCwJIjRfNGJzZCIsCSI0XzRCU0QiLAkJfSwKKwl7CUlIX09TX0RFTEwsCSJkZWxsIiwJCSJEZWxsIiwJCQl9LAorCXsJSUhfT1NfRVNJWCwJImVzaXgiLAkJIkVzaXgiLAkJCX0sCisJewlJSF9PU19GUkVFQlNELAkiZnJlZWJzZCIsCSJGcmVlQlNEIiwJCX0sCisJewlJSF9PU19JUklYLAkiaXJpeCIsCQkiSXJpeCIsCQkJfSwKKwl7CUlIX09TX05DUiwJIm5jciIsCQkiTkNSIiwJCQl9LAorCXsJSUhfT1NfT1BFTkJTRCwJIm9wZW5ic2QiLAkiT3BlbkJTRCIsCQl9LAorCXsJSUhfT1NfUFNPUywJInBzb3MiLAkJInBTT1MiLAkJCX0sCisJewlJSF9PU19TQ08sCSJzY28iLAkJIlNDTyIsCQkJfSwKKwl7CUlIX09TX1NPTEFSSVMsCSJzb2xhcmlzIiwJIlNvbGFyaXMiLAkJfSwKKwl7CUlIX09TX1NWUjQsCSJzdnI0IiwJCSJTVlI0IiwJCQl9LAorI2VuZGlmCisJewktMSwJCSIiLAkJIiIsCQkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV90eXBlW10gPSB7CisJewlJSF9UWVBFX0lOVkFMSUQsICAgIE5VTEwsCSAgIkludmFsaWQgSW1hZ2UiLAl9LAorCXsJSUhfVFlQRV9GSUxFU1lTVEVNLCAiZmlsZXN5c3RlbSIsICJGaWxlc3lzdGVtIEltYWdlIiwJfSwKKwl7CUlIX1RZUEVfRklSTVdBUkUsICAgImZpcm13YXJlIiwJICAiRmlybXdhcmUiLAkJfSwKKwl7CUlIX1RZUEVfS0VSTkVMLAkgICAgImtlcm5lbCIsCSAgIktlcm5lbCBJbWFnZSIsCX0sCisJewlJSF9UWVBFX01VTFRJLAkgICAgIm11bHRpIiwJICAiTXVsdGktRmlsZSBJbWFnZSIsCX0sCisJewlJSF9UWVBFX1JBTURJU0ssICAgICJyYW1kaXNrIiwJICAiUkFNRGlzayBJbWFnZSIsCX0sCisJewlJSF9UWVBFX1NDUklQVCwgICAgICJzY3JpcHQiLAkgICJTY3JpcHQiLAkJfSwKKwl7CUlIX1RZUEVfU1RBTkRBTE9ORSwgInN0YW5kYWxvbmUiLCAiU3RhbmRhbG9uZSBQcm9ncmFtIiwgfSwKKwl7CUlIX1RZUEVfRkxBVERULCAgICAgImZsYXRfZHQiLCAgICAiRmxhdCBEZXZpY2UgVHJlZSIsCX0sCisJewlJSF9UWVBFX0tXQklNQUdFLCAgICJrd2JpbWFnZSIsICAgIktpcmt3b29kIEJvb3QgSW1hZ2UiLH0sCisJewlJSF9UWVBFX0lNWElNQUdFLCAgICJpbXhpbWFnZSIsICAgIkZyZWVzY2FsZSBpLk1YIEJvb3QgSW1hZ2UiLH0sCisJewktMSwJCSAgICAiIiwJCSAgIiIsCQkJfSwKK307CisKK3N0YXRpYyB0YWJsZV9lbnRyeV90IHVpbWFnZV9jb21wW10gPSB7CisJewlJSF9DT01QX05PTkUsCSJub25lIiwJCSJ1bmNvbXByZXNzZWQiLAkJfSwKKwl7CUlIX0NPTVBfQlpJUDIsCSJiemlwMiIsCSJiemlwMiBjb21wcmVzc2VkIiwJfSwKKwl7CUlIX0NPTVBfR1pJUCwJImd6aXAiLAkJImd6aXAgY29tcHJlc3NlZCIsCX0sCisJewlJSF9DT01QX0xaTUEsCSJsem1hIiwJCSJsem1hIGNvbXByZXNzZWQiLAl9LAorCXsJSUhfQ09NUF9MWk8sCSJsem8iLAkJImx6byBjb21wcmVzc2VkIiwJfSwKKwl7CS0xLAkJIiIsCQkiIiwJCQl9LAorfTsKKwordWludDMyX3QgY3JjMzIgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOwordWludDMyX3QgY3JjMzJfd2QgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQsIHVpbnQpOworI2lmIGRlZmluZWQoQ09ORklHX1RJTUVTVEFNUCkgfHwgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpIHx8IGRlZmluZWQoVVNFX0hPU1RDQykKK3N0YXRpYyB2b2lkIGdlbmltZ19wcmludF90aW1lICh0aW1lX3QgdGltZXN0YW1wKTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMZWdhY3kgZm9ybWF0IHJvdXRpbmVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaW1hZ2VfY2hlY2tfaGNyYyAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwl1bG9uZyBoY3JjOworCXVsb25nIGxlbiA9IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAoKTsKKwlpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CisKKwkvKiBDb3B5IGhlYWRlciBzbyB3ZSBjYW4gYmxhbmsgQ1JDIGZpZWxkIGZvciByZS1jYWxjdWxhdGlvbiAqLworCW1lbW1vdmUgKCZoZWFkZXIsIChjaGFyICopaGRyLCBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworCWltYWdlX3NldF9oY3JjICgmaGVhZGVyLCAwKTsKKworCWhjcmMgPSBjcmMzMiAoMCwgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLCBsZW4pOworCisJcmV0dXJuIChoY3JjID09IGltYWdlX2dldF9oY3JjIChoZHIpKTsKK30KKworaW50IGltYWdlX2NoZWNrX2RjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJdWxvbmcgZGF0YSA9IGltYWdlX2dldF9kYXRhIChoZHIpOworCXVsb25nIGxlbiA9IGltYWdlX2dldF9kYXRhX3NpemUgKGhkcik7CisJdWxvbmcgZGNyYyA9IGNyYzMyX3dkICgwLCAodW5zaWduZWQgY2hhciAqKWRhdGEsIGxlbiwgQ0hVTktTWl9DUkMzMik7CisKKwlyZXR1cm4gKGRjcmMgPT0gaW1hZ2VfZ2V0X2RjcmMgKGhkcikpOworfQorCisvKioKKyAqIGltYWdlX211bHRpX2NvdW50IC0gZ2V0IGNvbXBvbmVudCAoc3ViLWltYWdlKSBjb3VudAorICogQGhkcjogcG9pbnRlciB0byB0aGUgaGVhZGVyIG9mIHRoZSBtdWx0aSBjb21wb25lbnQgaW1hZ2UKKyAqCisgKiBpbWFnZV9tdWx0aV9jb3VudCgpIHJldHVybnMgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gYSBtdWx0aQorICogY29tcG9uZW50IGltYWdlLgorICoKKyAqIE5vdGU6IG5vIGNoZWNraW5nIG9mIHRoZSBpbWFnZSB0eXBlIGlzIGRvbmUsIGNhbGxlciBtdXN0IHBhc3MKKyAqIGEgdmFsaWQgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqLwordWxvbmcgaW1hZ2VfbXVsdGlfY291bnQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJdWxvbmcgaSwgY291bnQgPSAwOworCXVpbnQzMl90ICpzaXplOworCisJLyogZ2V0IHN0YXJ0IG9mIHRoZSBpbWFnZSBwYXlsb2FkLCB3aGljaCBpbiBjYXNlIG9mIG11bHRpCisJICogY29tcG9uZW50IGltYWdlcyB0aGF0IHBvaW50cyB0byBhIHRhYmxlIG9mIGNvbXBvbmVudCBzaXplcyAqLworCXNpemUgPSAodWludDMyX3QgKilpbWFnZV9nZXRfZGF0YSAoaGRyKTsKKworCS8qIGNvdW50IG5vbiBlbXB0eSBzbG90cyAqLworCWZvciAoaSA9IDA7IHNpemVbaV07ICsraSkKKwkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBpbWFnZV9tdWx0aV9nZXRpbWcgLSBnZXQgY29tcG9uZW50IGRhdGEgYWRkcmVzcyBhbmQgc2l6ZQorICogQGhkcjogcG9pbnRlciB0byB0aGUgaGVhZGVyIG9mIHRoZSBtdWx0aSBjb21wb25lbnQgaW1hZ2UKKyAqIEBpZHg6IGluZGV4IG9mIHRoZSByZXF1ZXN0ZWQgY29tcG9uZW50CisgKiBAZGF0YTogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgY29tcG9uZW50IGRhdGEgYWRkcmVzcworICogQGxlbjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgY29tcG9uZW50IHNpemUKKyAqCisgKiBpbWFnZV9tdWx0aV9nZXRpbWcoKSByZXR1cm5zIHNpemUgYW5kIGRhdGEgYWRkcmVzcyBmb3IgdGhlIHJlcXVlc3RlZAorICogY29tcG9uZW50IGluIGEgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIE5vdGU6IG5vIGNoZWNraW5nIG9mIHRoZSBpbWFnZSB0eXBlIGlzIGRvbmUsIGNhbGxlciBtdXN0IHBhc3MKKyAqIGEgdmFsaWQgbXVsdGkgY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgZGF0YSBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBjb21wb25lbnQsIGlmIGlkeCBpcyB2YWxpZAorICogICAgIDAgaW4gZGF0YSBhbmQgbGVuLCBpZiBpZHggaXMgb3V0IG9mIHJhbmdlCisgKi8KK3ZvaWQgaW1hZ2VfbXVsdGlfZ2V0aW1nIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1bG9uZyBpZHgsCisJCQl1bG9uZyAqZGF0YSwgdWxvbmcgKmxlbikKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCAqc2l6ZTsKKwl1bG9uZyBvZmZzZXQsIGNvdW50LCBpbWdfZGF0YTsKKworCS8qIGdldCBudW1iZXIgb2YgY29tcG9uZW50ICovCisJY291bnQgPSBpbWFnZV9tdWx0aV9jb3VudCAoaGRyKTsKKworCS8qIGdldCBzdGFydCBvZiB0aGUgaW1hZ2UgcGF5bG9hZCwgd2hpY2ggaW4gY2FzZSBvZiBtdWx0aQorCSAqIGNvbXBvbmVudCBpbWFnZXMgdGhhdCBwb2ludHMgdG8gYSB0YWJsZSBvZiBjb21wb25lbnQgc2l6ZXMgKi8KKwlzaXplID0gKHVpbnQzMl90ICopaW1hZ2VfZ2V0X2RhdGEgKGhkcik7CisKKwkvKiBnZXQgYWRkcmVzcyBvZiB0aGUgcHJvcGVyIGNvbXBvbmVudCBkYXRhIHN0YXJ0LCB3aGljaCBtZWFucworCSAqIHNraXBwaW5nIHNpemVzIHRhYmxlIChhZGQgMSBmb3IgbGFzdCwgbnVsbCBlbnRyeSkgKi8KKwlpbWdfZGF0YSA9IGltYWdlX2dldF9kYXRhIChoZHIpICsgKGNvdW50ICsgMSkgKiBzaXplb2YgKHVpbnQzMl90KTsKKworCWlmIChpZHggPCBjb3VudCkgeworCQkqbGVuID0gdWltYWdlX3RvX2NwdSAoc2l6ZVtpZHhdKTsKKwkJb2Zmc2V0ID0gMDsKKworCQkvKiBnbyBvdmVyIGFsbCBpbmRpY2VzIHByZWNlZGluZyByZXF1ZXN0ZWQgY29tcG9uZW50IGlkeCAqLworCQlmb3IgKGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKwkJCS8qIGFkZCB1cCBpLXRoIGNvbXBvbmVudCBzaXplLCByb3VuZGluZyB1cCB0byA0IGJ5dGVzICovCisJCQlvZmZzZXQgKz0gKHVpbWFnZV90b19jcHUgKHNpemVbaV0pICsgMykgJiB+MyA7CisJCX0KKworCQkvKiBjYWxjdWxhdGUgaWR4LXRoIGNvbXBvbmVudCBkYXRhIGFkZHJlc3MgKi8KKwkJKmRhdGEgPSBpbWdfZGF0YSArIG9mZnNldDsKKwl9IGVsc2UgeworCQkqbGVuID0gMDsKKwkJKmRhdGEgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgaW1hZ2VfcHJpbnRfdHlwZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwljb25zdCBjaGFyICpvcywgKmFyY2gsICp0eXBlLCAqY29tcDsKKworCW9zID0gZ2VuaW1nX2dldF9vc19uYW1lIChpbWFnZV9nZXRfb3MgKGhkcikpOworCWFyY2ggPSBnZW5pbWdfZ2V0X2FyY2hfbmFtZSAoaW1hZ2VfZ2V0X2FyY2ggKGhkcikpOworCXR5cGUgPSBnZW5pbWdfZ2V0X3R5cGVfbmFtZSAoaW1hZ2VfZ2V0X3R5cGUgKGhkcikpOworCWNvbXAgPSBnZW5pbWdfZ2V0X2NvbXBfbmFtZSAoaW1hZ2VfZ2V0X2NvbXAgKGhkcikpOworCisJcHJpbnRmICgiJXMgJXMgJXMgKCVzKVxuIiwgYXJjaCwgb3MsIHR5cGUsIGNvbXApOworfQorCisvKioKKyAqIGltYWdlX3ByaW50X2NvbnRlbnRzIC0gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGxlZ2FjeSBmb3JtYXQgaW1hZ2UKKyAqIEBwdHI6IHBvaW50ZXIgdG8gdGhlIGxlZ2FjeSBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogaW1hZ2VfcHJpbnRfY29udGVudHMoKSBmb3JtYXRzIGEgbXVsdGkgbGluZSBsZWdhY3kgaW1hZ2UgY29udGVudHMgZGVzY3JpcHRpb24uCisgKiBUaGUgcm91dGluZSBwcmludHMgb3V0IGFsbCBoZWFkZXIgZmllbGRzIGZvbGxvd2VkIGJ5IHRoZSBzaXplL29mZnNldCBkYXRhCisgKiBmb3IgTVVMVEkvU0NSSVBUIGltYWdlcy4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBpbWFnZV9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqcHRyKQoreworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIgPSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKilwdHI7CisJY29uc3QgY2hhciAqcDsKKworI2lmZGVmIFVTRV9IT1NUQ0MKKwlwID0gIiI7CisjZWxzZQorCXAgPSAiICAgIjsKKyNlbmRpZgorCisJcHJpbnRmICgiJXNJbWFnZSBOYW1lOiAgICUuKnNcbiIsIHAsIElIX05NTEVOLCBpbWFnZV9nZXRfbmFtZSAoaGRyKSk7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXByaW50ZiAoIiVzQ3JlYXRlZDogICAgICAiLCBwKTsKKwlnZW5pbWdfcHJpbnRfdGltZSAoKHRpbWVfdClpbWFnZV9nZXRfdGltZSAoaGRyKSk7CisjZW5kaWYKKwlwcmludGYgKCIlc0ltYWdlIFR5cGU6ICAgIiwgcCk7CisJaW1hZ2VfcHJpbnRfdHlwZSAoaGRyKTsKKwlwcmludGYgKCIlc0RhdGEgU2l6ZTogICAgIiwgcCk7CisJZ2VuaW1nX3ByaW50X3NpemUgKGltYWdlX2dldF9kYXRhX3NpemUgKGhkcikpOworCXByaW50ZiAoIiVzTG9hZCBBZGRyZXNzOiAlMDh4XG4iLCBwLCBpbWFnZV9nZXRfbG9hZCAoaGRyKSk7CisJcHJpbnRmICgiJXNFbnRyeSBQb2ludDogICUwOHhcbiIsIHAsIGltYWdlX2dldF9lcCAoaGRyKSk7CisKKwlpZiAoaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX01VTFRJKSB8fAorCQkJaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX1NDUklQVCkpIHsKKwkJaW50IGk7CisJCXVsb25nIGRhdGEsIGxlbjsKKwkJdWxvbmcgY291bnQgPSBpbWFnZV9tdWx0aV9jb3VudCAoaGRyKTsKKworCQlwcmludGYgKCIlc0NvbnRlbnRzOlxuIiwgcCk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpbWFnZV9tdWx0aV9nZXRpbWcgKGhkciwgaSwgJmRhdGEsICZsZW4pOworCisJCQlwcmludGYgKCIlcyAgIEltYWdlICVkOiAiLCBwLCBpKTsKKwkJCWdlbmltZ19wcmludF9zaXplIChsZW4pOworCisJCQlpZiAoaW1hZ2VfY2hlY2tfdHlwZSAoaGRyLCBJSF9UWVBFX1NDUklQVCkgJiYgaSA+IDApIHsKKwkJCQkvKgorCQkJCSAqIHRoZSB1c2VyIG1heSBuZWVkIHRvIGtub3cgb2Zmc2V0cworCQkJCSAqIGlmIHBsYW5uaW5nIHRvIGRvIHNvbWV0aGluZyB3aXRoCisJCQkJICogbXVsdGlwbGUgZmlsZXMKKwkJCQkgKi8KKwkJCQlwcmludGYgKCIlcyAgICBPZmZzZXQgPSAweCUwOGx4XG4iLCBwLCBkYXRhKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogU2hhcmVkIGR1YWwtZm9ybWF0IHJvdXRpbmVzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFVTRV9IT1NUQ0MKK3ZvaWQgbWVtbW92ZV93ZCAodm9pZCAqdG8sIHZvaWQgKmZyb20sIHNpemVfdCBsZW4sIHVsb25nIGNodW5rc3opCit7CisJaWYgKHRvID09IGZyb20pCisJCXJldHVybjsKKworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwl3aGlsZSAobGVuID4gMCkgeworCQlzaXplX3QgdGFpbCA9IChsZW4gPiBjaHVua3N6KSA/IGNodW5rc3ogOiBsZW47CisJCVdBVENIRE9HX1JFU0VUICgpOworCQltZW1tb3ZlICh0bywgZnJvbSwgdGFpbCk7CisJCXRvICs9IHRhaWw7CisJCWZyb20gKz0gdGFpbDsKKwkJbGVuIC09IHRhaWw7CisJfQorI2Vsc2UJLyogIShDT05GSUdfSFdfV0FUQ0hET0cgfHwgQ09ORklHX1dBVENIRE9HKSAqLworCW1lbW1vdmUgKHRvLCBmcm9tLCBsZW4pOworI2VuZGlmCS8qIENPTkZJR19IV19XQVRDSERPRyB8fCBDT05GSUdfV0FUQ0hET0cgKi8KK30KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCit2b2lkIGdlbmltZ19wcmludF9zaXplICh1aW50MzJfdCBzaXplKQoreworI2lmbmRlZiBVU0VfSE9TVENDCisJcHJpbnRmICgiJWQgQnl0ZXMgPSAiLCBzaXplKTsKKwlwcmludF9zaXplIChzaXplLCAiXG4iKTsKKyNlbHNlCisJcHJpbnRmICgiJWQgQnl0ZXMgPSAlLjJmIGtCID0gJS4yZiBNQlxuIiwKKwkJCXNpemUsIChkb3VibGUpc2l6ZSAvIDEuMDI0ZTMsCisJCQkoZG91YmxlKXNpemUgLyAxLjA0ODU3NmU2KTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorc3RhdGljIHZvaWQgZ2VuaW1nX3ByaW50X3RpbWUgKHRpbWVfdCB0aW1lc3RhbXApCit7CisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwl0b190bSAodGltZXN0YW1wLCAmdG0pOworCXByaW50ZiAoIiU0ZC0lMDJkLSUwMmQgICUyZDolMDJkOiUwMmQgVVRDXG4iLAorCQkJdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAorCQkJdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworI2Vsc2UKKwlwcmludGYgKCIlcyIsIGN0aW1lKCZ0aW1lc3RhbXApKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENPTkZJR19USU1FU1RBTVAgfHwgQ09ORklHX0NNRF9EQVRFIHx8IFVTRV9IT1NUQ0MgKi8KKworLyoqCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSAtIHRyYW5zbGF0ZSBlbnRyeSBpZCB0byBsb25nIG5hbWUKKyAqIEB0YWJsZTogcG9pbnRlciB0byBhIHRyYW5zbGF0aW9uIHRhYmxlIGZvciBlbnRyaWVzIG9mIGEgc3BlY2lmaWMgdHlwZQorICogQG1zZzogbWVzc2FnZSB0byBiZSByZXR1cm5lZCB3aGVuIHRyYW5zbGF0aW9uIGZhaWxzCisgKiBAaWQ6IGVudHJ5IGlkIHRvIGJlIHRyYW5zbGF0ZWQKKyAqCisgKiBnZXRfdGFibGVfZW50cnlfbmFtZSgpIHdpbGwgZ28gb3ZlciB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZAorICogZW50cnkgdGhhdCBtYXRjaGVzIGdpdmVuIGlkLiBJZiBtYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwgaXRzIGxvbmcKKyAqIG5hbWUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGxvbmcgZW50cnkgbmFtZSBpZiB0cmFuc2xhdGlvbiBzdWNjZWVkcworICogICAgIG1zZyBvdGhlcndpc2UKKyAqLworY2hhciAqZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLCBjaGFyICptc2csIGludCBpZCkKK3sKKwlmb3IgKDsgdGFibGUtPmlkID49IDA7ICsrdGFibGUpIHsKKwkJaWYgKHRhYmxlLT5pZCA9PSBpZCkKKwkJCXJldHVybiB0YWJsZS0+bG5hbWU7CisJfQorCXJldHVybiAobXNnKTsKK30KKworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9vc19uYW1lICh1aW50OF90IG9zKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9vcywgIlVua25vd24gT1MiLCBvcykpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2FyY2hfbmFtZSAodWludDhfdCBhcmNoKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9hcmNoLCAiVW5rbm93biBBcmNoaXRlY3R1cmUiLCBhcmNoKSk7Cit9CisKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfdHlwZV9uYW1lICh1aW50OF90IHR5cGUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfbmFtZSAodWltYWdlX3R5cGUsICJVbmtub3duIEltYWdlIiwgdHlwZSkpOworfQorCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X2NvbXBfbmFtZSAodWludDhfdCBjb21wKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X25hbWUgKHVpbWFnZV9jb21wLCAiVW5rbm93biBDb21wcmVzc2lvbiIsIGNvbXApKTsKK30KKworLyoqCisgKiBnZXRfdGFibGVfZW50cnlfaWQgLSB0cmFuc2xhdGUgc2hvcnQgZW50cnkgbmFtZSB0byBpZAorICogQHRhYmxlOiBwb2ludGVyIHRvIGEgdHJhbnNsYXRpb24gdGFibGUgZm9yIGVudHJpZXMgb2YgYSBzcGVjaWZpYyB0eXBlCisgKiBAdGFibGVfbmFtZTogdG8gYmUgdXNlZCBpbiBjYXNlIG9mIGVycm9yCisgKiBAbmFtZTogZW50cnkgc2hvcnQgbmFtZSB0byBiZSB0cmFuc2xhdGVkCisgKgorICogZ2V0X3RhYmxlX2VudHJ5X2lkKCkgd2lsbCBnbyBvdmVyIHRyYW5zbGF0aW9uIHRhYmxlIHRyeWluZyB0byBmaW5kCisgKiBlbnRyeSB0aGF0IG1hdGNoZXMgZ2l2ZW4gc2hvcnQgbmFtZS4gSWYgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsCisgKiBpdHMgaWQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGVudHJ5IGlkIGlmIHRyYW5zbGF0aW9uIHN1Y2NlZWRzCisgKiAgICAgLTEgb3RoZXJ3aXNlCisgKi8KK2ludCBnZXRfdGFibGVfZW50cnlfaWQgKHRhYmxlX2VudHJ5X3QgKnRhYmxlLAorCQljb25zdCBjaGFyICp0YWJsZV9uYW1lLCBjb25zdCBjaGFyICpuYW1lKQoreworCXRhYmxlX2VudHJ5X3QgKnQ7CisjaWZkZWYgVVNFX0hPU1RDQworCWludCBmaXJzdCA9IDE7CisKKwlmb3IgKHQgPSB0YWJsZTsgdC0+aWQgPj0gMDsgKyt0KSB7CisJCWlmICh0LT5zbmFtZSAmJiBzdHJjYXNlY21wKHQtPnNuYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICh0LT5pZCk7CisJfQorCisJZnByaW50ZiAoc3RkZXJyLCAiXG5JbnZhbGlkICVzIFR5cGUgLSB2YWxpZCBuYW1lcyBhcmUiLCB0YWJsZV9uYW1lKTsKKwlmb3IgKHQgPSB0YWJsZTsgdC0+aWQgPj0gMDsgKyt0KSB7CisJCWlmICh0LT5zbmFtZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZwcmludGYgKHN0ZGVyciwgIiVjICVzIiwgKGZpcnN0KSA/ICc6JyA6ICcsJywgdC0+c25hbWUpOworCQlmaXJzdCA9IDA7CisJfQorCWZwcmludGYgKHN0ZGVyciwgIlxuIik7CisjZWxzZQorCWZvciAodCA9IHRhYmxlOyB0LT5pZCA+PSAwOyArK3QpIHsKKwkJaWYgKHQtPnNuYW1lICYmIHN0cmNtcCh0LT5zbmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAodC0+aWQpOworCX0KKwlkZWJ1ZyAoIkludmFsaWQgJXMgVHlwZTogJXNcbiIsIHRhYmxlX25hbWUsIG5hbWUpOworI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworaW50IGdlbmltZ19nZXRfb3NfaWQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIChnZXRfdGFibGVfZW50cnlfaWQgKHVpbWFnZV9vcywgIk9TIiwgbmFtZSkpOworfQorCitpbnQgZ2VuaW1nX2dldF9hcmNoX2lkIChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAoZ2V0X3RhYmxlX2VudHJ5X2lkICh1aW1hZ2VfYXJjaCwgIkNQVSIsIG5hbWUpKTsKK30KKworaW50IGdlbmltZ19nZXRfdHlwZV9pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX3R5cGUsICJJbWFnZSIsIG5hbWUpKTsKK30KKworaW50IGdlbmltZ19nZXRfY29tcF9pZCAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gKGdldF90YWJsZV9lbnRyeV9pZCAodWltYWdlX2NvbXAsICJDb21wcmVzc2lvbiIsIG5hbWUpKTsKK30KKworI2lmbmRlZiBVU0VfSE9TVENDCisvKioKKyAqIGdlbmltZ19nZXRfZm9ybWF0IC0gZ2V0IGltYWdlIGZvcm1hdCB0eXBlCisgKiBAaW1nX2FkZHI6IGltYWdlIHN0YXJ0IGFkZHJlc3MKKyAqCisgKiBnZW5pbWdfZ2V0X2Zvcm1hdCgpIGNoZWNrcyB3aGV0aGVyIHByb3ZpZGVkIGFkZHJlc3MgcG9pbnRzIHRvIGEgdmFsaWQKKyAqIGxlZ2FjeSBvciBGSVQgaW1hZ2UuCisgKgorICogTmV3IHVJbWFnZSBmb3JtYXQgYW5kIEZEVCBibG9iIGFyZSBiYXNlZCBvbiBhIGxpYmZkdC4gRkRUIGJsb2IKKyAqIG1heSBiZSBwYXNzZWQgZGlyZWN0bHkgb3IgZW1iZWRkZWQgaW4gYSBGSVQgaW1hZ2UuIEluIGJvdGggc2l0dWF0aW9ucworICogZ2VuaW1nX2dldF9mb3JtYXQoKSBtdXN0IGJlIGFibGUgdG8gZGVjdGVjdCBsaWJmZHQgaGVhZGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2UgZm9ybWF0IHR5cGUgb3IgSU1BR0VfRk9STUFUX0lOVkFMSUQgaWYgbm8gaW1hZ2UgaXMgcHJlc2VudAorICovCitpbnQgZ2VuaW1nX2dldF9mb3JtYXQgKHZvaWQgKmltZ19hZGRyKQoreworCXVsb25nIGZvcm1hdCA9IElNQUdFX0ZPUk1BVF9JTlZBTElEOworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHI7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJY2hhciAqZml0X2hkcjsKKyNlbmRpZgorCisJaGRyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopaW1nX2FkZHI7CisJaWYgKGltYWdlX2NoZWNrX21hZ2ljKGhkcikpCisJCWZvcm1hdCA9IElNQUdFX0ZPUk1BVF9MRUdBQ1k7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKSB8fCBkZWZpbmVkKENPTkZJR19PRl9MSUJGRFQpCisJZWxzZSB7CisJCWZpdF9oZHIgPSAoY2hhciAqKWltZ19hZGRyOworCQlpZiAoZmR0X2NoZWNrX2hlYWRlciAoZml0X2hkcikgPT0gMCkKKwkJCWZvcm1hdCA9IElNQUdFX0ZPUk1BVF9GSVQ7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gZm9ybWF0OworfQorCisvKioKKyAqIGdlbmltZ19nZXRfaW1hZ2UgLSBnZXQgaW1hZ2UgZnJvbSBzcGVjaWFsIHN0b3JhZ2UgKGlmIG5lY2Vzc2FyeSkKKyAqIEBpbWdfYWRkcjogaW1hZ2Ugc3RhcnQgYWRkcmVzcworICoKKyAqIGdlbmltZ19nZXRfaW1hZ2UoKSBjaGVja3MgaWYgcHJvdmlkZWQgaW1hZ2Ugc3RhcnQgYWRkZHJlc3MgaXMgbG9jYXRlZAorICogaW4gYSBkYXRhZmxhc2ggc3RvcmFnZS4gSWYgc28sIGltYWdlIGlzIG1vdmVkIHRvIGEgc3lzdGVtIFJBTSBtZW1vcnkuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBzdGFydCBhZGRyZXNzIGFmdGVyIHBvc3NpYmxlIHJlbG9jYXRpb24gZnJvbSBzcGVjaWFsIHN0b3JhZ2UKKyAqLwordWxvbmcgZ2VuaW1nX2dldF9pbWFnZSAodWxvbmcgaW1nX2FkZHIpCit7CisJdWxvbmcgcmFtX2FkZHIgPSBpbWdfYWRkcjsKKworI2lmZGVmIENPTkZJR19IQVNfREFUQUZMQVNICisJdWxvbmcgaF9zaXplLCBkX3NpemU7CisKKwlpZiAoYWRkcl9kYXRhZmxhc2ggKGltZ19hZGRyKSl7CisJCS8qIGdlciBSQU0gYWRkcmVzcyAqLworCQlyYW1fYWRkciA9IENPTkZJR19TWVNfTE9BRF9BRERSOworCisJCS8qIGdldCBoZWFkZXIgc2l6ZSAqLworCQloX3NpemUgPSBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCk7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQlpZiAoc2l6ZW9mKHN0cnVjdCBmZHRfaGVhZGVyKSA+IGhfc2l6ZSkKKwkJCWhfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZmR0X2hlYWRlcik7CisjZW5kaWYKKworCQkvKiByZWFkIGluIGhlYWRlciAqLworCQlkZWJ1ZyAoIiAgIFJlYWRpbmcgaW1hZ2UgaGVhZGVyIGZyb20gZGF0YWZsYXNoIGFkZHJlc3MgIgorCQkJIiUwOGx4IHRvIFJBTSBhZGRyZXNzICUwOGx4XG4iLCBpbWdfYWRkciwgcmFtX2FkZHIpOworCisJCXJlYWRfZGF0YWZsYXNoIChpbWdfYWRkciwgaF9zaXplLCAoY2hhciAqKXJhbV9hZGRyKTsKKworCQkvKiBnZXQgZGF0YSBzaXplICovCisJCXN3aXRjaCAoZ2VuaW1nX2dldF9mb3JtYXQgKCh2b2lkICopcmFtX2FkZHIpKSB7CisJCWNhc2UgSU1BR0VfRk9STUFUX0xFR0FDWToKKwkJCWRfc2l6ZSA9IGltYWdlX2dldF9kYXRhX3NpemUgKChjb25zdCBpbWFnZV9oZWFkZXJfdCAqKXJhbV9hZGRyKTsKKwkJCWRlYnVnICgiICAgTGVnYWN5IGZvcm1hdCBpbWFnZSBmb3VuZCBhdCAweCUwOGx4LCBzaXplIDB4JTA4bHhcbiIsCisJCQkJCXJhbV9hZGRyLCBkX3NpemUpOworCQkJYnJlYWs7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQljYXNlIElNQUdFX0ZPUk1BVF9GSVQ6CisJCQlkX3NpemUgPSBmaXRfZ2V0X3NpemUgKChjb25zdCB2b2lkICopcmFtX2FkZHIpIC0gaF9zaXplOworCQkJZGVidWcgKCIgICBGSVQvRkRUIGZvcm1hdCBpbWFnZSBmb3VuZCBhdCAweCUwOGx4LCBzaXplIDB4JTA4bHhcbiIsCisJCQkJCXJhbV9hZGRyLCBkX3NpemUpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXByaW50ZiAoIiAgIE5vIHZhbGlkIGltYWdlIGZvdW5kIGF0IDB4JTA4bHhcbiIsIGltZ19hZGRyKTsKKwkJCXJldHVybiByYW1fYWRkcjsKKwkJfQorCisJCS8qIHJlYWQgaW4gaW1hZ2UgZGF0YSAqLworCQlkZWJ1ZyAoIiAgIFJlYWRpbmcgaW1hZ2UgcmVtYWluaW5nIGRhdGEgZnJvbSBkYXRhZmxhc2ggYWRkcmVzcyAiCisJCQkiJTA4bHggdG8gUkFNIGFkZHJlc3MgJTA4bHhcbiIsIGltZ19hZGRyICsgaF9zaXplLAorCQkJcmFtX2FkZHIgKyBoX3NpemUpOworCisJCXJlYWRfZGF0YWZsYXNoIChpbWdfYWRkciArIGhfc2l6ZSwgZF9zaXplLAorCQkJCShjaGFyICopKHJhbV9hZGRyICsgaF9zaXplKSk7CisKKwl9CisjZW5kaWYgLyogQ09ORklHX0hBU19EQVRBRkxBU0ggKi8KKworCXJldHVybiByYW1fYWRkcjsKK30KKworLyoqCisgKiBmaXRfaGFzX2NvbmZpZyAtIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmFsaWQgRklUIGNvbmZpZ3VyYXRpb24KKyAqIEBpbWFnZXM6IHBvaW50ZXIgdG8gdGhlIGJvb3RtIGNvbW1hbmQgaGVhZGVycyBzdHJ1Y3R1cmUKKyAqCisgKiBmaXRfaGFzX2NvbmZpZygpIGNoZWNrcyBpZiB0aGVyZSBpcyBhIEZJVCBjb25maWd1cmF0aW9uIGluIHVzZQorICogKGlmIEZUSSBzdXBwb3J0IGlzIHByZXNlbnQpLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgbm8gRklUIHN1cHBvcnQgb3Igbm8gY29uZmlndXJhdGlvbiBmb3VuZAorICogICAgIDEsIGNvbmZpZ3VyYXRpb24gZm91bmQKKyAqLworaW50IGdlbmltZ19oYXNfY29uZmlnIChib290bV9oZWFkZXJzX3QgKmltYWdlcykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJaWYgKGltYWdlcy0+Zml0X3VuYW1lX2NmZykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKK3N0YXRpYyB2b2lkIGZkdF9lcnJvciAoY29uc3QgY2hhciAqbXNnKQoreworCXB1dHMgKCJFUlJPUjogIik7CisJcHV0cyAobXNnKTsKKwlwdXRzICgiIC0gbXVzdCBSRVNFVCB0aGUgYm9hcmQgdG8gcmVjb3Zlci5cbiIpOworfQorCitzdGF0aWMgY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmltYWdlX2dldF9mZHQgKHVsb25nIGZkdF9hZGRyKQoreworCWNvbnN0IGltYWdlX2hlYWRlcl90ICpmZHRfaGRyID0gKGNvbnN0IGltYWdlX2hlYWRlcl90ICopZmR0X2FkZHI7CisKKwlpbWFnZV9wcmludF9jb250ZW50cyAoZmR0X2hkcik7CisKKwlwdXRzICgiICAgVmVyaWZ5aW5nIENoZWNrc3VtIC4uLiAiKTsKKwlpZiAoIWltYWdlX2NoZWNrX2hjcmMgKGZkdF9oZHIpKSB7CisJCWZkdF9lcnJvciAoImZkdCBoZWFkZXIgY2hlY2tzdW0gaW52YWxpZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWltYWdlX2NoZWNrX2RjcmMgKGZkdF9oZHIpKSB7CisJCWZkdF9lcnJvciAoImZkdCBjaGVja3N1bSBpbnZhbGlkIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwdXRzICgiT0tcbiIpOworCisJaWYgKCFpbWFnZV9jaGVja190eXBlIChmZHRfaGRyLCBJSF9UWVBFX0ZMQVREVCkpIHsKKwkJZmR0X2Vycm9yICgidUltYWdlIGlzIG5vdCBhIGZkdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGltYWdlX2dldF9jb21wIChmZHRfaGRyKSAhPSBJSF9DT01QX05PTkUpIHsKKwkJZmR0X2Vycm9yICgidUltYWdlIGlzIGNvbXByZXNzZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChmZHRfY2hlY2tfaGVhZGVyICgoY2hhciAqKWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSkgIT0gMCkgeworCQlmZHRfZXJyb3IgKCJ1SW1hZ2UgZGF0YSBpcyBub3QgYSBmZHQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBmZHRfaGRyOworfQorCisvKioKKyAqIGZpdF9jaGVja19mZHQgLSB2ZXJpZnkgRklUIGZvcm1hdCBGRFQgc3ViaW1hZ2UKKyAqIEBmaXRfaGRyOiBwb2ludGVyIHRvIHRoZSBGSVQgIGhlYWRlcgorICogZmR0X25vZmZzZXQ6IEZEVCBzdWJpbWFnZSBub2RlIG9mZnNldCB3aXRoaW4gRklUIGltYWdlCisgKiBAdmVyaWZ5OiBkYXRhIENSQyB2ZXJpZmljYXRpb24gZmxhZworICoKKyAqIGZpdF9jaGVja19mZHQoKSB2ZXJpZmllcyBpbnRlZ3JpdHkgb2YgdGhlIEZEVCBzdWJpbWFnZSBhbmQgZnJvbQorICogc3BlY2lmaWVkIEZJVCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCitzdGF0aWMgaW50IGZpdF9jaGVja19mZHQgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGZkdF9ub2Zmc2V0LCBpbnQgdmVyaWZ5KQoreworCWZpdF9pbWFnZV9wcmludCAoZml0LCBmZHRfbm9mZnNldCwgIiAgICIpOworCisJaWYgKHZlcmlmeSkgeworCQlwdXRzICgiICAgVmVyaWZ5aW5nIEhhc2ggSW50ZWdyaXR5IC4uLiAiKTsKKwkJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChmaXQsIGZkdF9ub2Zmc2V0KSkgeworCQkJZmR0X2Vycm9yICgiQmFkIERhdGEgSGFzaCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHV0cyAoIk9LXG4iKTsKKwl9CisKKwlpZiAoIWZpdF9pbWFnZV9jaGVja190eXBlIChmaXQsIGZkdF9ub2Zmc2V0LCBJSF9UWVBFX0ZMQVREVCkpIHsKKwkJZmR0X2Vycm9yICgiTm90IGEgRkRUIGltYWdlIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghZml0X2ltYWdlX2NoZWNrX2NvbXAgKGZpdCwgZmR0X25vZmZzZXQsIElIX0NPTVBfTk9ORSkpIHsKKwkJZmR0X2Vycm9yICgiRkRUIGltYWdlIGlzIGNvbXByZXNzZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLworCisjaWZuZGVmIENPTkZJR19TWVNfRkRUX1BBRAorI2RlZmluZSBDT05GSUdfU1lTX0ZEVF9QQUQgMHgzMDAwCisjZW5kaWYKKworLyoqCisgKiBib290X3JlbG9jYXRlX2ZkdCAtIHJlbG9jYXRlIGZsYXQgZGV2aWNlIHRyZWUKKyAqIEBsbWI6IHBvaW50ZXIgdG8gbG1iIGhhbmRsZSwgd2lsbCBiZSB1c2VkIGZvciBtZW1vcnkgbWdtdAorICogQGJvb3RtYXBfYmFzZTogYmFzZSBhZGRyZXNzIG9mIHRoZSBib290bWFwIHJlZ2lvbgorICogQG9mX2ZsYXRfdHJlZTogcG9pbnRlciB0byBhIGNoYXIqIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IHN0YXJ0IGFkZHJlc3MKKyAqIEBvZl9zaXplOiBwb2ludGVyIHRvIGEgdWxvbmcgdmFyaWFibGUsIHdpbGwgaG9sZCBmZHQgbGVuZ3RoCisgKgorICogYm9vdF9yZWxvY2F0ZV9mZHQoKSBkZXRlcm1pbmVzIGlmIHRoZSBvZl9mbGF0X3RyZWUgYWRkcmVzcyBpcyB3aXRoaW4KKyAqIHRoZSBib290bWFwIGFuZCBpZiBub3QgcmVsb2NhdGVzIGl0IGludG8gdGhhdCByZWdpb24KKyAqCisgKiBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byBmaW5hbCAoYWZ0ZXIgcmVsb2NhdGlvbikgdmFsdWVzCisgKgorICogcmV0dXJuczoKKyAqICAgICAgMCAtIHN1Y2Nlc3MKKyAqICAgICAgMSAtIGZhaWx1cmUKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NZU19CT09UTUFQU1opCitpbnQgYm9vdF9yZWxvY2F0ZV9mZHQgKHN0cnVjdCBsbWIgKmxtYiwgdWxvbmcgYm9vdG1hcF9iYXNlLAorCQljaGFyICoqb2ZfZmxhdF90cmVlLCB1bG9uZyAqb2Zfc2l6ZSkKK3sKKwljaGFyCSpmZHRfYmxvYiA9ICpvZl9mbGF0X3RyZWU7CisJdWxvbmcJcmVsb2NhdGUgPSAwOworCXVsb25nCW9mX2xlbiA9IDA7CisKKwkvKiBub3RoaW5nIHRvIGRvICovCisJaWYgKCpvZl9zaXplID09IDApCisJCXJldHVybiAwOworCisJaWYgKGZkdF9jaGVja19oZWFkZXIgKGZkdF9ibG9iKSAhPSAwKSB7CisJCWZkdF9lcnJvciAoImltYWdlIGlzIG5vdCBhIGZkdCIpOworCQlnb3RvIGVycm9yOworCX0KKworI2lmbmRlZiBDT05GSUdfU1lTX05PX0ZMQVNICisJLyogbW92ZSB0aGUgYmxvYiBpZiBpdCBpcyBpbiBmbGFzaCAoc2V0IHJlbG9jYXRlKSAqLworCWlmIChhZGRyMmluZm8gKCh1bG9uZylmZHRfYmxvYikgIT0gTlVMTCkKKwkJcmVsb2NhdGUgPSAxOworI2VuZGlmCisKKwkvKgorCSAqIFRoZSBibG9iIG5lZWRzIHRvIGJlIGluc2lkZSB0aGUgYm9vdCBtYXBwaW5nLgorCSAqLworCWlmIChmZHRfYmxvYiA8IChjaGFyICopYm9vdG1hcF9iYXNlKQorCQlyZWxvY2F0ZSA9IDE7CisKKwlpZiAoKGZkdF9ibG9iICsgKm9mX3NpemUgKyBDT05GSUdfU1lTX0ZEVF9QQUQpID49CisJCQkoKGNoYXIgKilDT05GSUdfU1lTX0JPT1RNQVBTWiArIGJvb3RtYXBfYmFzZSkpCisJCXJlbG9jYXRlID0gMTsKKworCS8qIG1vdmUgZmxhdHRlbmQgZGV2aWNlIHRyZWUgaWYgbmVlZGVkICovCisJaWYgKHJlbG9jYXRlKSB7CisJCWludCBlcnI7CisJCXVsb25nIG9mX3N0YXJ0ID0gMDsKKworCQkvKiBwb3NpdGlvbiBvbiBhIDRLIGJvdW5kYXJ5IGJlZm9yZSB0aGUgYWxsb2NfY3VycmVudCAqLworCQkvKiBQYWQgdGhlIEZEVCBieSBhIHNwZWNpZmllZCBhbW91bnQgKi8KKwkJb2ZfbGVuID0gKm9mX3NpemUgKyBDT05GSUdfU1lTX0ZEVF9QQUQ7CisJCW9mX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpbG1iX2FsbG9jX2Jhc2UobG1iLCBvZl9sZW4sIDB4MTAwMCwKKwkJCQkoQ09ORklHX1NZU19CT09UTUFQU1ogKyBib290bWFwX2Jhc2UpKTsKKworCQlpZiAob2Zfc3RhcnQgPT0gMCkgeworCQkJcHV0cygiZGV2aWNlIHRyZWUgLSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlkZWJ1ZyAoIiMjIGRldmljZSB0cmVlIGF0IDB4JTA4bFggLi4uIDB4JTA4bFggKGxlbj0lbGQ9MHglbFgpXG4iLAorCQkJKHVsb25nKWZkdF9ibG9iLCAodWxvbmcpZmR0X2Jsb2IgKyAqb2Zfc2l6ZSAtIDEsCisJCQlvZl9sZW4sIG9mX2xlbik7CisKKwkJcHJpbnRmICgiICAgTG9hZGluZyBEZXZpY2UgVHJlZSB0byAlMDhseCwgZW5kICUwOGx4IC4uLiAiLAorCQkJb2Zfc3RhcnQsIG9mX3N0YXJ0ICsgb2ZfbGVuIC0gMSk7CisKKwkJZXJyID0gZmR0X29wZW5faW50byAoZmR0X2Jsb2IsICh2b2lkICopb2Zfc3RhcnQsIG9mX2xlbik7CisJCWlmIChlcnIgIT0gMCkgeworCQkJZmR0X2Vycm9yICgiZmR0IG1vdmUgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXB1dHMgKCJPS1xuIik7CisKKwkJKm9mX2ZsYXRfdHJlZSA9IChjaGFyICopb2Zfc3RhcnQ7CisJCSpvZl9zaXplID0gb2ZfbGVuOworCX0gZWxzZSB7CisJCSpvZl9mbGF0X3RyZWUgPSBmZHRfYmxvYjsKKwkJb2ZfbGVuID0gKENPTkZJR19TWVNfQk9PVE1BUFNaICsgYm9vdG1hcF9iYXNlKSAtICh1bG9uZylmZHRfYmxvYjsKKwkJbG1iX3Jlc2VydmUobG1iLCAodWxvbmcpZmR0X2Jsb2IsIG9mX2xlbik7CisJCWZkdF9zZXRfdG90YWxzaXplKCpvZl9mbGF0X3RyZWUsIG9mX2xlbik7CisKKwkJKm9mX3NpemUgPSBvZl9sZW47CisJfQorCisJc2V0X3dvcmtpbmdfZmR0X2FkZHIoKm9mX2ZsYXRfdHJlZSk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19TWVNfQk9PVE1BUFNaICovCisKKy8qKgorICogYm9vdF9nZXRfZmR0IC0gbWFpbiBmZHQgaGFuZGxpbmcgcm91dGluZQorICogQGFyZ2M6IGNvbW1hbmQgYXJndW1lbnQgY291bnQKKyAqIEBhcmd2OiBjb21tYW5kIGFyZ3VtZW50IGxpc3QKKyAqIEBpbWFnZXM6IHBvaW50ZXIgdG8gdGhlIGJvb3RtIGltYWdlcyBzdHJ1Y3R1cmUKKyAqIEBvZl9mbGF0X3RyZWU6IHBvaW50ZXIgdG8gYSBjaGFyKiB2YXJpYWJsZSwgd2lsbCBob2xkIGZkdCBzdGFydCBhZGRyZXNzCisgKiBAb2Zfc2l6ZTogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgZmR0IGxlbmd0aAorICoKKyAqIGJvb3RfZ2V0X2ZkdCgpIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgdmFsaWQgZmxhdCBkZXZpY2UgdHJlZSBpbWFnZS4KKyAqIEN1cmVudGx5IHN1cHBvcnRlZCBhcmUgdGhlIGZvbGxvd2luZyByYW1kaXNrIHNvdXJjZXM6CisgKiAgICAgIC0gbXVsdGljb21wb25lbnQga2VybmVsL3JhbWRpc2sgaW1hZ2UsCisgKiAgICAgIC0gY29tbWFuZGxpbmUgcHJvdmlkZWQgYWRkcmVzcyBvZiBkZWNpY2F0ZWQgcmFtZGlzayBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIGlmIGZkdCBpbWFnZSB3YXMgZm91bmQgYW5kIHZhbGlkLCBvciBza2lwcGVkCisgKiAgICAgb2ZfZmxhdF90cmVlIGFuZCBvZl9zaXplIGFyZSBzZXQgdG8gZmR0IHN0YXJ0IGFkZHJlc3MgYW5kIGxlbmd0aCBpZgorICogICAgIGZkdCBpbWFnZSBpcyBmb3VuZCBhbmQgdmFsaWQKKyAqCisgKiAgICAgMSwgaWYgZmR0IGltYWdlIGlzIGZvdW5kIGJ1dCBjb3JydXB0ZWQKKyAqICAgICBvZl9mbGF0X3RyZWUgYW5kIG9mX3NpemUgYXJlIHNldCB0byAwIGlmIG5vIGZkdCBleGlzdHMKKyAqLworaW50IGJvb3RfZ2V0X2ZkdCAoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcywKKwkJY2hhciAqKm9mX2ZsYXRfdHJlZSwgdWxvbmcgKm9mX3NpemUpCit7CisJY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmZkdF9oZHI7CisJdWxvbmcJCWZkdF9hZGRyOworCWNoYXIJCSpmZHRfYmxvYiA9IE5VTEw7CisJdWxvbmcJCWltYWdlX3N0YXJ0LCBpbWFnZV9lbmQ7CisJdWxvbmcJCWxvYWRfc3RhcnQsIGxvYWRfZW5kOworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKwl2b2lkCQkqZml0X2hkcjsKKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfZmR0ID0gTlVMTDsKKwl1bG9uZwkJZGVmYXVsdF9hZGRyOworCWludAkJY2ZnX25vZmZzZXQ7CisJaW50CQlmZHRfbm9mZnNldDsKKwljb25zdCB2b2lkCSpkYXRhOworCXNpemVfdAkJc2l6ZTsKKyNlbmRpZgorCisJKm9mX2ZsYXRfdHJlZSA9IE5VTEw7CisJKm9mX3NpemUgPSAwOworCisJaWYgKGFyZ2MgPiAzIHx8IGdlbmltZ19oYXNfY29uZmlnIChpbWFnZXMpKSB7CisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQlpZiAoYXJnYyA+IDMpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgRkRUIGJsb2IgY29tZXMgZnJvbSB0aGUgRklUIGltYWdlIGFuZCB0aGUKKwkJCSAqIEZJVCBpbWFnZSBhZGRyZXNzIGlzIG9taXR0ZWQgaW4gdGhlIGNvbW1hbmQgbGluZQorCQkJICogYXJndW1lbnQsIHRyeSB0byB1c2UgcmFtZGlzayBvciBvcyBGSVQgaW1hZ2UKKwkJCSAqIGFkZHJlc3Mgb3IgZGVmYXVsdCBsb2FkIGFkZHJlc3MuCisJCQkgKi8KKwkJCWlmIChpbWFnZXMtPmZpdF91bmFtZV9yZCkKKwkJCQlkZWZhdWx0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX3JkOworCQkJZWxzZSBpZiAoaW1hZ2VzLT5maXRfdW5hbWVfb3MpCisJCQkJZGVmYXVsdF9hZGRyID0gKHVsb25nKWltYWdlcy0+Zml0X2hkcl9vczsKKwkJCWVsc2UKKwkJCQlkZWZhdWx0X2FkZHIgPSBsb2FkX2FkZHI7CisKKwkJCWlmIChmaXRfcGFyc2VfY29uZiAoYXJndlszXSwgZGVmYXVsdF9hZGRyLAorCQkJCQkJJmZkdF9hZGRyLCAmZml0X3VuYW1lX2NvbmZpZykpIHsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogY29uZmlnICclcycgZnJvbSBpbWFnZSBhdCAweCUwOGx4XG4iLAorCQkJCQkJZml0X3VuYW1lX2NvbmZpZywgZmR0X2FkZHIpOworCQkJfSBlbHNlIGlmIChmaXRfcGFyc2Vfc3ViaW1hZ2UgKGFyZ3ZbM10sIGRlZmF1bHRfYWRkciwKKwkJCQkJCSZmZHRfYWRkciwgJmZpdF91bmFtZV9mZHQpKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IHN1YmltYWdlICclcycgZnJvbSBpbWFnZSBhdCAweCUwOGx4XG4iLAorCQkJCQkJZml0X3VuYW1lX2ZkdCwgZmR0X2FkZHIpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQlmZHRfYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwkJCQlkZWJ1ZyAoIiogIGZkdDogY21kbGluZSBpbWFnZSBhZGRyZXNzID0gMHglMDhseFxuIiwKKwkJCQkJCWZkdF9hZGRyKTsKKwkJCX0KKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisJCX0gZWxzZSB7CisJCQkvKiB1c2UgRklUIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgaW4gZmlyc3QgYm9vdG0KKwkJCSAqIGNvbW1hbmQgYXJndW1lbnQKKwkJCSAqLworCQkJZmR0X2FkZHIgPSAodWxvbmcpaW1hZ2VzLT5maXRfaGRyX29zOworCQkJZml0X3VuYW1lX2NvbmZpZyA9IGltYWdlcy0+Zml0X3VuYW1lX2NmZzsKKwkJCWRlYnVnICgiKiAgZmR0OiB1c2luZyBjb25maWcgJyVzJyBmcm9tIGltYWdlIGF0IDB4JTA4bHhcbiIsCisJCQkJCWZpdF91bmFtZV9jb25maWcsIGZkdF9hZGRyKTsKKworCQkJLyoKKwkJCSAqIENoZWNrIHdoZXRoZXIgY29uZmlndXJhdGlvbiBoYXMgRkRUIGJsb2IgZGVmaW5lZCwKKwkJCSAqIGlmIG5vdCBxdWl0IHNpbGVudGx5LgorCQkJICovCisJCQlmaXRfaGRyID0gKHZvaWQgKilmZHRfYWRkcjsKKwkJCWNmZ19ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X25vZGUgKGZpdF9oZHIsCisJCQkJCWZpdF91bmFtZV9jb25maWcpOworCQkJaWYgKGNmZ19ub2Zmc2V0IDwgMCkgeworCQkJCWRlYnVnICgiKiAgZmR0OiBubyBzdWNoIGNvbmZpZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWZkdF9ub2Zmc2V0ID0gZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChmaXRfaGRyLAorCQkJCQljZmdfbm9mZnNldCk7CisJCQlpZiAoZmR0X25vZmZzZXQgPCAwKSB7CisJCQkJZGVidWcgKCIqICBmZHQ6IG5vIGZkdCBpbiBjb25maWdcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisjZW5kaWYKKworCQlkZWJ1ZyAoIiMjIENoZWNraW5nIGZvciAnRkRUJy8nRkRUIEltYWdlJyBhdCAlMDhseFxuIiwKKwkJCQlmZHRfYWRkcik7CisKKwkJLyogY29weSBmcm9tIGRhdGFmbGFzaCBpZiBuZWVkZWQgKi8KKwkJZmR0X2FkZHIgPSBnZW5pbWdfZ2V0X2ltYWdlIChmZHRfYWRkcik7CisKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gRkRUIGltYWdlIGF0IHRoZQorCQkgKiBhZGRyZXNzIHByb3ZpZGVkIGluIHRoZSBzZWNvbmQgYm9vdG0gYXJndW1lbnQKKwkJICogY2hlY2sgaW1hZ2UgdHlwZSwgZm9yIEZJVCBpbWFnZXMgZ2V0IGEgRklUIG5vZGUuCisJCSAqLworCQlzd2l0Y2ggKGdlbmltZ19nZXRfZm9ybWF0ICgodm9pZCAqKWZkdF9hZGRyKSkgeworCQljYXNlIElNQUdFX0ZPUk1BVF9MRUdBQ1k6CisJCQkvKiB2ZXJpZnkgZmR0X2FkZHIgcG9pbnRzIHRvIGEgdmFsaWQgaW1hZ2UgaGVhZGVyICovCisJCQlwcmludGYgKCIjIyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUgZnJvbSBMZWdhY3kgSW1hZ2UgYXQgJTA4bHhcbiIsCisJCQkJCWZkdF9hZGRyKTsKKwkJCWZkdF9oZHIgPSBpbWFnZV9nZXRfZmR0IChmZHRfYWRkcik7CisJCQlpZiAoIWZkdF9oZHIpCisJCQkJZ290byBlcnJvcjsKKworCQkJLyoKKwkJCSAqIG1vdmUgaW1hZ2UgZGF0YSB0byB0aGUgbG9hZCBhZGRyZXNzLAorCQkJICogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSBpbml0aWFsIGltYWdlCisJCQkgKi8KKwkJCWltYWdlX3N0YXJ0ID0gKHVsb25nKWZkdF9oZHI7CisJCQlpbWFnZV9lbmQgPSBpbWFnZV9nZXRfaW1hZ2VfZW5kIChmZHRfaGRyKTsKKworCQkJbG9hZF9zdGFydCA9IGltYWdlX2dldF9sb2FkIChmZHRfaGRyKTsKKwkJCWxvYWRfZW5kID0gbG9hZF9zdGFydCArIGltYWdlX2dldF9kYXRhX3NpemUgKGZkdF9oZHIpOworCisJCQlpZiAoKGxvYWRfc3RhcnQgPCBpbWFnZV9lbmQpICYmIChsb2FkX2VuZCA+IGltYWdlX3N0YXJ0KSkgeworCQkJCWZkdF9lcnJvciAoImZkdCBvdmVyd3JpdHRlbiIpOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWRlYnVnICgiICAgTG9hZGluZyBGRFQgZnJvbSAweCUwOGx4IHRvIDB4JTA4bHhcbiIsCisJCQkJCWltYWdlX2dldF9kYXRhIChmZHRfaGRyKSwgbG9hZF9zdGFydCk7CisKKwkJCW1lbW1vdmUgKCh2b2lkICopbG9hZF9zdGFydCwKKwkJCQkJKHZvaWQgKilpbWFnZV9nZXRfZGF0YSAoZmR0X2hkciksCisJCQkJCWltYWdlX2dldF9kYXRhX3NpemUgKGZkdF9oZHIpKTsKKworCQkJZmR0X2Jsb2IgPSAoY2hhciAqKWxvYWRfc3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBJTUFHRV9GT1JNQVRfRklUOgorCQkJLyoKKwkJCSAqIFRoaXMgY2FzZSB3aWxsIGNhdGNoIGJvdGg6IG5ldyB1SW1hZ2UgZm9ybWF0CisJCQkgKiAobGliZmR0IGJhc2VkKSBhbmQgcmF3IEZEVCBibG9iIChhbHNvIGxpYmZkdAorCQkJICogYmFzZWQpLgorCQkJICovCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCQkJLyogY2hlY2sgRkRUIGJsb2IgdnMgRklUIGJsb2IgKi8KKwkJCWlmIChmaXRfY2hlY2tfZm9ybWF0ICgoY29uc3Qgdm9pZCAqKWZkdF9hZGRyKSkgeworCQkJCS8qCisJCQkJICogRklUIGltYWdlCisJCQkJICovCisJCQkJZml0X2hkciA9ICh2b2lkICopZmR0X2FkZHI7CisJCQkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGZyb20gRklUIEltYWdlIGF0ICUwOGx4XG4iLAorCQkJCQkJZmR0X2FkZHIpOworCisJCQkJaWYgKCFmaXRfdW5hbWVfZmR0KSB7CisJCQkJCS8qCisJCQkJCSAqIG5vIEZEVCBibG9iIGltYWdlIG5vZGUgdW5pdCBuYW1lLAorCQkJCQkgKiB0cnkgdG8gZ2V0IGNvbmZpZyBub2RlIGZpcnN0LiBJZgorCQkJCQkgKiBjb25maWcgdW5pdCBub2RlIG5hbWUgaXMgTlVMTAorCQkJCQkgKiBmaXRfY29uZl9nZXRfbm9kZSgpIHdpbGwgdHJ5IHRvCisJCQkJCSAqIGZpbmQgZGVmYXVsdCBjb25maWcgbm9kZQorCQkJCQkgKi8KKwkJCQkJY2ZnX25vZmZzZXQgPSBmaXRfY29uZl9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQlmaXRfdW5hbWVfY29uZmlnKTsKKworCQkJCQlpZiAoY2ZnX25vZmZzZXQgPCAwKSB7CisJCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBjb25maWd1cmF0aW9uIG5vZGVcbiIpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCisJCQkJCWZpdF91bmFtZV9jb25maWcgPSBmZHRfZ2V0X25hbWUgKGZpdF9oZHIsCisJCQkJCQkJY2ZnX25vZmZzZXQsIE5VTEwpOworCQkJCQlwcmludGYgKCIgICBVc2luZyAnJXMnIGNvbmZpZ3VyYXRpb25cbiIsCisJCQkJCQkJZml0X3VuYW1lX2NvbmZpZyk7CisKKwkJCQkJZmR0X25vZmZzZXQgPSBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGZpdF9oZHIsCisJCQkJCQkJY2ZnX25vZmZzZXQpOworCQkJCQlmaXRfdW5hbWVfZmR0ID0gZml0X2dldF9uYW1lIChmaXRfaGRyLAorCQkJCQkJCWZkdF9ub2Zmc2V0LCBOVUxMKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBnZXQgRkRUIGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldCAqLworCQkJCQlmZHRfbm9mZnNldCA9IGZpdF9pbWFnZV9nZXRfbm9kZSAoZml0X2hkciwKKwkJCQkJCQlmaXRfdW5hbWVfZmR0KTsKKwkJCQl9CisJCQkJaWYgKGZkdF9ub2Zmc2V0IDwgMCkgeworCQkJCQlmZHRfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBzdWJpbWFnZSBub2RlXG4iKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQlwcmludGYgKCIgICBUcnlpbmcgJyVzJyBGRFQgYmxvYiBzdWJpbWFnZVxuIiwKKwkJCQkJCWZpdF91bmFtZV9mZHQpOworCisJCQkJaWYgKCFmaXRfY2hlY2tfZmR0IChmaXRfaGRyLCBmZHRfbm9mZnNldCwKKwkJCQkJCQlpbWFnZXMtPnZlcmlmeSkpCisJCQkJCWdvdG8gZXJyb3I7CisKKwkJCQkvKiBnZXQgcmFtZGlzayBpbWFnZSBkYXRhIGFkZHJlc3MgYW5kIGxlbmd0aCAqLworCQkJCWlmIChmaXRfaW1hZ2VfZ2V0X2RhdGEgKGZpdF9oZHIsIGZkdF9ub2Zmc2V0LAorCQkJCQkJCSZkYXRhLCAmc2l6ZSkpIHsKKwkJCQkJZmR0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgRkRUIHN1YmltYWdlIGRhdGEiKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisKKwkJCQkvKiB2ZXJpZnQgdGhhdCBpbWFnZSBkYXRhIGlzIGEgcHJvcGVyIEZEVCBibG9iICovCisJCQkJaWYgKGZkdF9jaGVja19oZWFkZXIgKChjaGFyICopZGF0YSkgIT0gMCkgeworCQkJCQlmZHRfZXJyb3IgKCJTdWJpbWFnZSBkYXRhIGlzIG5vdCBhIEZURCIpOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKworCQkJCS8qCisJCQkJICogbW92ZSBpbWFnZSBkYXRhIHRvIHRoZSBsb2FkIGFkZHJlc3MsCisJCQkJICogbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJ3cml0ZSBpbml0aWFsIGltYWdlCisJCQkJICovCisJCQkJaW1hZ2Vfc3RhcnQgPSAodWxvbmcpZml0X2hkcjsKKwkJCQlpbWFnZV9lbmQgPSBmaXRfZ2V0X2VuZCAoZml0X2hkcik7CisKKwkJCQlpZiAoZml0X2ltYWdlX2dldF9sb2FkIChmaXRfaGRyLCBmZHRfbm9mZnNldCwKKwkJCQkJCQkmbG9hZF9zdGFydCkgPT0gMCkgeworCQkJCQlsb2FkX2VuZCA9IGxvYWRfc3RhcnQgKyBzaXplOworCisJCQkJCWlmICgobG9hZF9zdGFydCA8IGltYWdlX2VuZCkgJiYKKwkJCQkJCQkobG9hZF9lbmQgPiBpbWFnZV9zdGFydCkpIHsKKwkJCQkJCWZkdF9lcnJvciAoIkZEVCBvdmVyd3JpdHRlbiIpOworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCisJCQkJCXByaW50ZiAoIiAgIExvYWRpbmcgRkRUIGZyb20gMHglMDhseCB0byAweCUwOGx4XG4iLAorCQkJCQkJCSh1bG9uZylkYXRhLCBsb2FkX3N0YXJ0KTsKKworCQkJCQltZW1tb3ZlICgodm9pZCAqKWxvYWRfc3RhcnQsCisJCQkJCQkJKHZvaWQgKilkYXRhLCBzaXplKTsKKworCQkJCQlmZHRfYmxvYiA9IChjaGFyICopbG9hZF9zdGFydDsKKwkJCQl9IGVsc2UgeworCQkJCQlmZHRfYmxvYiA9IChjaGFyICopZGF0YTsKKwkJCQl9CisKKwkJCQlpbWFnZXMtPmZpdF9oZHJfZmR0ID0gZml0X2hkcjsKKwkJCQlpbWFnZXMtPmZpdF91bmFtZV9mZHQgPSBmaXRfdW5hbWVfZmR0OworCQkJCWltYWdlcy0+Zml0X25vZmZzZXRfZmR0ID0gZmR0X25vZmZzZXQ7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJeworCQkJCS8qCisJCQkJICogRkRUIGJsb2IKKwkJCQkgKi8KKwkJCQlmZHRfYmxvYiA9IChjaGFyICopZmR0X2FkZHI7CisJCQkJZGVidWcgKCIqICBmZHQ6IHJhdyBGRFQgYmxvYlxuIik7CisJCQkJcHJpbnRmICgiIyMgRmxhdHRlbmVkIERldmljZSBUcmVlIGJsb2IgYXQgJTA4bHhcbiIsIChsb25nKWZkdF9ibG9iKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0cyAoIkVSUk9SOiBEaWQgbm90IGZpbmQgYSBjbWRsaW5lIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZVxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJcHJpbnRmICgiICAgQm9vdGluZyB1c2luZyB0aGUgZmR0IGJsb2IgYXQgMHgleFxuIiwgKGludClmZHRfYmxvYik7CisKKwl9IGVsc2UgaWYgKGltYWdlcy0+bGVnYWN5X2hkcl92YWxpZCAmJgorCQkJaW1hZ2VfY2hlY2tfdHlwZSAoJmltYWdlcy0+bGVnYWN5X2hkcl9vc19jb3B5LCBJSF9UWVBFX01VTFRJKSkgeworCisJCXVsb25nIGZkdF9kYXRhLCBmZHRfbGVuOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBpZiB3ZSBoYXZlIGEgbGVnYWN5IG11bHRpLWNvbXBvbmVudCBpbWFnZSwKKwkJICogZ2V0IHNlY29uZCBlbnRyeSBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIGxlbi4KKwkJICovCisJCXByaW50ZiAoIiMjIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSBmcm9tIG11bHRpICIKKwkJCSJjb21wb25lbnQgSW1hZ2UgYXQgJTA4bFhcbiIsCisJCQkodWxvbmcpaW1hZ2VzLT5sZWdhY3lfaGRyX29zKTsKKworCQlpbWFnZV9tdWx0aV9nZXRpbWcgKGltYWdlcy0+bGVnYWN5X2hkcl9vcywgMiwgJmZkdF9kYXRhLCAmZmR0X2xlbik7CisJCWlmIChmZHRfbGVuKSB7CisKKwkJCWZkdF9ibG9iID0gKGNoYXIgKilmZHRfZGF0YTsKKwkJCXByaW50ZiAoIiAgIEJvb3RpbmcgdXNpbmcgdGhlIGZkdCBhdCAweCV4XG4iLCAoaW50KWZkdF9ibG9iKTsKKworCQkJaWYgKGZkdF9jaGVja19oZWFkZXIgKGZkdF9ibG9iKSAhPSAwKSB7CisJCQkJZmR0X2Vycm9yICgiaW1hZ2UgaXMgbm90IGEgZmR0Iik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKworCQkJaWYgKGJlMzJfdG9fY3B1IChmZHRfdG90YWxzaXplIChmZHRfYmxvYikpICE9IGZkdF9sZW4pIHsKKwkJCQlmZHRfZXJyb3IgKCJmZHQgc2l6ZSAhPSBpbWFnZSBzaXplIik7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRlYnVnICgiIyMgTm8gRmxhdHRlbmVkIERldmljZSBUcmVlXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIHsKKwkJZGVidWcgKCIjIyBObyBGbGF0dGVuZWQgRGV2aWNlIFRyZWVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqb2ZfZmxhdF90cmVlID0gZmR0X2Jsb2I7CisJKm9mX3NpemUgPSBiZTMyX3RvX2NwdSAoZmR0X3RvdGFsc2l6ZSAoZmR0X2Jsb2IpKTsKKwlkZWJ1ZyAoIiAgIG9mX2ZsYXRfdHJlZSBhdCAweCUwOGx4IHNpemUgMHglMDhseFxuIiwKKwkJCSh1bG9uZykqb2ZfZmxhdF90cmVlLCAqb2Zfc2l6ZSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJKm9mX2ZsYXRfdHJlZSA9IDA7CisJKm9mX3NpemUgPSAwOworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19PRl9MSUJGRFQgKi8KKyNlbmRpZiAvKiAhVVNFX0hPU1RDQyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTmV3IHVJbWFnZSBmb3JtYXQgcm91dGluZXMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGludCBmaXRfcGFyc2Vfc3BlYyAoY29uc3QgY2hhciAqc3BlYywgY2hhciBzZXBjLCB1bG9uZyBhZGRyX2N1cnIsCisJCXVsb25nICphZGRyLCBjb25zdCBjaGFyICoqbmFtZSkKK3sKKwljb25zdCBjaGFyICpzZXA7CisKKwkqYWRkciA9IGFkZHJfY3VycjsKKwkqbmFtZSA9IE5VTEw7CisKKwlzZXAgPSBzdHJjaHIgKHNwZWMsIHNlcGMpOworCWlmIChzZXApIHsKKwkJaWYgKHNlcCAtIHNwZWMgPiAwKQorCQkJKmFkZHIgPSBzaW1wbGVfc3RydG91bCAoc3BlYywgTlVMTCwgMTYpOworCisJCSpuYW1lID0gc2VwICsgMTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X3BhcnNlX2NvbmYgLSBwYXJzZSBGSVQgY29uZmlndXJhdGlvbiBzcGVjCisgKiBAc3BlYzogaW5wdXQgc3RyaW5nLCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gc3BlYworICogQGFkZF9jdXJyOiBjdXJyZW50IGltYWdlIGFkZHJlc3MgKHRvIGJlIHVzZWQgYXMgYSBwb3NzaWJsZSBkZWZhdWx0KQorICogQGFkZHI6IHBvaW50ZXIgdG8gYSB1bG9uZyB2YXJpYWJsZSwgd2lsbCBob2xkIEZJVCBpbWFnZSBhZGRyZXNzIG9mIGEgZ2l2ZW4KKyAqIGNvbmZpZ3VyYXRpb24KKyAqIEBjb25mX25hbWUgZG91YmxlIHBvaW50ZXIgdG8gYSBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byBhIGNvbmZpZ3VyYXRpb24KKyAqIHVuaXQgbmFtZQorICoKKyAqIGZpdF9wYXJzZV9jb25mKCkgZXhwZWN0cyBjb25maWd1cmF0aW9uIHNwZWMgaW4gdGhlIGZvciBvZiBbPGFkZHI+XSM8Y29uZj4sCisgKiB3aGVyZSA8YWRkcj4gaXMgYSBGSVQgaW1hZ2UgYWRkcmVzcyB0aGF0IGNvbnRhaW5zIGNvbmZpZ3VyYXRpb24KKyAqIHdpdGggYSA8Y29uZj4gdW5pdCBuYW1lLgorICoKKyAqIEFkZHJlc3MgcGFydCBpcyBvcHRpb25hbCwgYW5kIGlmIG9taXR0ZWQgZGVmYXVsdCBhZGRfY3VyciB3aWxsCisgKiBiZSB1c2VkIGluc3RlYWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIHNwZWMgaXMgYSB2YWxpZCBjb25maWd1cmF0aW9uIHN0cmluZywKKyAqICAgICBhZGRyIGFuZCBjb25mX25hbWUgYXJlIHNldCBhY2NvcmRpbmdseQorICogICAgIDAgb3RoZXJ3aXNlCisgKi8KK2lubGluZSBpbnQgZml0X3BhcnNlX2NvbmYgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipjb25mX25hbWUpCit7CisJcmV0dXJuIGZpdF9wYXJzZV9zcGVjIChzcGVjLCAnIycsIGFkZHJfY3VyciwgYWRkciwgY29uZl9uYW1lKTsKK30KKworLyoqCisgKiBmaXRfcGFyc2Vfc3ViaW1hZ2UgLSBwYXJzZSBGSVQgc3ViaW1hZ2Ugc3BlYworICogQHNwZWM6IGlucHV0IHN0cmluZywgY29udGFpbmluZyBzdWJpbWFnZSBzcGVjCisgKiBAYWRkX2N1cnI6IGN1cnJlbnQgaW1hZ2UgYWRkcmVzcyAodG8gYmUgdXNlZCBhcyBhIHBvc3NpYmxlIGRlZmF1bHQpCisgKiBAYWRkcjogcG9pbnRlciB0byBhIHVsb25nIHZhcmlhYmxlLCB3aWxsIGhvbGQgRklUIGltYWdlIGFkZHJlc3Mgb2YgYSBnaXZlbgorICogc3ViaW1hZ2UKKyAqIEBpbWFnZV9uYW1lOiBkb3VibGUgcG9pbnRlciB0byBhIGNoYXIsIHdpbGwgaG9sZCBwb2ludGVyIHRvIGEgc3ViaW1hZ2UgbmFtZQorICoKKyAqIGZpdF9wYXJzZV9zdWJpbWFnZSgpIGV4cGVjdHMgc3ViaW1hZ2Ugc3BlYyBpbiB0aGUgZm9yIG9mCisgKiBbPGFkZHI+XTo8c3ViaW1hZ2U+LCB3aGVyZSA8YWRkcj4gaXMgYSBGSVQgaW1hZ2UgYWRkcmVzcyB0aGF0IGNvbnRhaW5zCisgKiBzdWJpbWFnZSB3aXRoIGEgPHN1YmltZz4gdW5pdCBuYW1lLgorICoKKyAqIEFkZHJlc3MgcGFydCBpcyBvcHRpb25hbCwgYW5kIGlmIG9taXR0ZWQgZGVmYXVsdCBhZGRfY3VyciB3aWxsCisgKiBiZSB1c2VkIGluc3RlYWQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxIGlmIHNwZWMgaXMgYSB2YWxpZCBzdWJpbWFnZSBzdHJpbmcsCisgKiAgICAgYWRkciBhbmQgaW1hZ2VfbmFtZSBhcmUgc2V0IGFjY29yZGluZ2x5CisgKiAgICAgMCBvdGhlcndpc2UKKyAqLworaW5saW5lIGludCBmaXRfcGFyc2Vfc3ViaW1hZ2UgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKippbWFnZV9uYW1lKQoreworCXJldHVybiBmaXRfcGFyc2Vfc3BlYyAoc3BlYywgJzonLCBhZGRyX2N1cnIsIGFkZHIsIGltYWdlX25hbWUpOworfQorI2VuZGlmIC8qICFVU0VfSE9TVENDICovCisKK3N0YXRpYyB2b2lkIGZpdF9nZXRfZGVidWcgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNoYXIgKnByb3BfbmFtZSwgaW50IGVycikKK3sKKwlkZWJ1ZyAoIkNhbid0IGdldCAnJXMnIHByb3BlcnR5IGZyb20gRklUIDB4JTA4bHgsICIKKwkJIm5vZGU6IG9mZnNldCAlZCwgbmFtZSAlcyAoJXMpXG4iLAorCQlwcm9wX25hbWUsICh1bG9uZylmaXQsIG5vZmZzZXQsCisJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJZmR0X3N0cmVycm9yIChlcnIpKTsKK30KKworLyoqCisgKiBmaXRfcHJpbnRfY29udGVudHMgLSBwcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgRklUIGZvcm1hdCBpbWFnZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfcHJpbnRfY29udGVudHMoKSBmb3JtYXRzIGEgbXVsdGkgbGluZSBGSVQgaW1hZ2UgY29udGVudHMgZGVzY3JpcHRpb24uCisgKiBUaGUgcm91dGluZSBwcmludHMgb3V0IEZJVCBpbWFnZSBwcm9wZXJ0aWVzIChyb290IG5vZGUgbGV2ZWwpIGZvbGx3ZWQgYnkKKyAqIHRoZSBkZXRhaWxzIG9mIGVhY2ggY29tcG9uZW50IGltYWdlLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgbm8gcmV0dXJuZWQgcmVzdWx0cworICovCit2b2lkIGZpdF9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqZml0KQoreworCWNoYXIgKmRlc2M7CisJY2hhciAqdW5hbWU7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBjb25mc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0OworCWNvbnN0IGNoYXIgKnA7CisjaWYgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKSB8fCBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChVU0VfSE9TVENDKQorCXRpbWVfdCB0aW1lc3RhbXA7CisjZW5kaWYKKworI2lmZGVmIFVTRV9IT1NUQ0MKKwlwID0gIiI7CisjZWxzZQorCXAgPSAiICAgIjsKKyNlbmRpZgorCisJLyogUm9vdCBub2RlIHByb3BlcnRpZXMgKi8KKwlyZXQgPSBmaXRfZ2V0X2Rlc2MgKGZpdCwgMCwgJmRlc2MpOworCXByaW50ZiAoIiVzRklUIGRlc2NyaXB0aW9uOiAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJcmV0ID0gZml0X2dldF90aW1lc3RhbXAgKGZpdCwgMCwgJnRpbWVzdGFtcCk7CisJcHJpbnRmICgiJXNDcmVhdGVkOiAgICAgICAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCWdlbmltZ19wcmludF90aW1lICh0aW1lc3RhbXApOworI2VuZGlmCisKKwkvKiBGaW5kIGltYWdlcyBwYXJlbnQgbm9kZSBvZmZzZXQgKi8KKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZmluZCBpbWFnZXMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0lNQUdFU19QQVRILCBmZHRfc3RyZXJyb3IgKGltYWdlc19ub2Zmc2V0KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBQcm9jZXNzIGl0cyBzdWJub2RlcywgcHJpbnQgb3V0IGNvbXBvbmVudCBpbWFnZXMgZGV0YWlscyAqLworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgaW1hZ2VzIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKwkJCSAqLworCQkJcHJpbnRmICgiJXMgSW1hZ2UgJXUgKCVzKVxuIiwgcCwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lKGZpdCwgbm9mZnNldCwgTlVMTCkpOworCisJCQlmaXRfaW1hZ2VfcHJpbnQgKGZpdCwgbm9mZnNldCwgcCk7CisJCX0KKwl9CisKKwkvKiBGaW5kIGNvbmZpZ3VyYXRpb25zIHBhcmVudCBub2RlIG9mZnNldCAqLworCWNvbmZzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0NPTkZTX1BBVEgpOworCWlmIChjb25mc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGdldCBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfQ09ORlNfUEFUSCwgZmR0X3N0cmVycm9yIChjb25mc19ub2Zmc2V0KSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uIHVuaXQgbmFtZSBmcm9tIGRlZmF1bHQgcHJvcGVydHkgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgTlVMTCk7CisJaWYgKHVuYW1lKQorCQlwcmludGYgKCIlcyBEZWZhdWx0IENvbmZpZ3VyYXRpb246ICclcydcbiIsIHAsIHVuYW1lKTsKKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29uZmlndXJhdGlvbnMgZGV0YWlscyAqLworCWZvciAobmRlcHRoID0gMCwgY291bnQgPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBjb25mc19ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9ucyBwYXJlbnQgbm9kZSwKKwkJCSAqIGkuZS4gY29uZmlndXJhdGlvbiBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIlcyBDb25maWd1cmF0aW9uICV1ICglcylcbiIsIHAsIGNvdW50KyssCisJCQkJCWZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCQkJZml0X2NvbmZfcHJpbnQgKGZpdCwgbm9mZnNldCwgcCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogZml0X2ltYWdlX3ByaW50IC0gcHJpbnRzIG91dCB0aGUgRklUIGNvbXBvbmVudCBpbWFnZSBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IG9mZnNldCBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBwOiBwb2ludGVyIHRvIHByZWZpeCBzdHJpbmcKKyAqCisgKiBmaXRfaW1hZ2VfcHJpbnQoKSBsaXN0cyBhbGwgbWFuZGF0b3J5IHByb3BlcmllcyBmb3IgdGhlIHByb2Nlc3NlZCBjb21wb25lbnQKKyAqIGltYWdlLiBJZiBwcmVzZW50LCBoYXNoIG5vZGVzIGFyZSBwcmludGVkIG91dCBhcyB3ZWxsLiBMb2FkCisgKiBhZGRyZXNzIGZvciBpbWFnZXMgb2YgdHlwZSBmaXJtd2FyZSBpcyBhbHNvIHByaW50ZWQgb3V0LiBTaW5jZSB0aGUgbG9hZAorICogYWRkcmVzcyBpcyBub3QgbWFuZGF0b3J5IGZvciBmaXJtd2FyZSBpbWFnZXMsIGl0IHdpbGwgYmUgb3V0cHV0IGFzCisgKiAidW5hdmFpbGFibGUiIHdoZW4gbm90IHByZXNlbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X2ltYWdlX3ByaW50IChjb25zdCB2b2lkICpmaXQsIGludCBpbWFnZV9ub2Zmc2V0LCBjb25zdCBjaGFyICpwKQoreworCWNoYXIgKmRlc2M7CisJdWludDhfdCB0eXBlLCBhcmNoLCBvcywgY29tcDsKKwlzaXplX3Qgc2l6ZTsKKwl1bG9uZyBsb2FkLCBlbnRyeTsKKwljb25zdCB2b2lkICpkYXRhOworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IHJldDsKKworCS8qIE1hbmRhdG9yeSBwcm9wZXJ0aWVzICovCisJcmV0ID0gZml0X2dldF9kZXNjIChmaXQsIGltYWdlX25vZmZzZXQsICZkZXNjKTsKKwlwcmludGYgKCIlcyAgRGVzY3JpcHRpb246ICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIlc1xuIiwgZGVzYyk7CisKKwlmaXRfaW1hZ2VfZ2V0X3R5cGUgKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJnR5cGUpOworCXByaW50ZiAoIiVzICBUeXBlOiAgICAgICAgICVzXG4iLCBwLCBnZW5pbWdfZ2V0X3R5cGVfbmFtZSAodHlwZSkpOworCisJZml0X2ltYWdlX2dldF9jb21wIChmaXQsIGltYWdlX25vZmZzZXQsICZjb21wKTsKKwlwcmludGYgKCIlcyAgQ29tcHJlc3Npb246ICAlc1xuIiwgcCwgZ2VuaW1nX2dldF9jb21wX25hbWUgKGNvbXApKTsKKworCXJldCA9IGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGF0YSwgJnNpemUpOworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKwlwcmludGYgKCIlcyAgRGF0YSBTdGFydDogICAiLCBwKTsKKwlpZiAocmV0KQorCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJZWxzZQorCQlwcmludGYgKCIweCUwOGx4XG4iLCAodWxvbmcpZGF0YSk7CisjZW5kaWYKKworCXByaW50ZiAoIiVzICBEYXRhIFNpemU6ICAgICIsIHApOworCWlmIChyZXQpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCWdlbmltZ19wcmludF9zaXplIChzaXplKTsKKworCS8qIFJlbWFpbmluZywgdHlwZSBkZXBlbmRlbnQgcHJvcGVydGllcyAqLworCWlmICgodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgfHwgKHR5cGUgPT0gSUhfVFlQRV9TVEFOREFMT05FKSB8fAorCSAgICAodHlwZSA9PSBJSF9UWVBFX1JBTURJU0spIHx8ICh0eXBlID09IElIX1RZUEVfRklSTVdBUkUpIHx8CisJICAgICh0eXBlID09IElIX1RZUEVfRkxBVERUKSkgeworCQlmaXRfaW1hZ2VfZ2V0X2FyY2ggKGZpdCwgaW1hZ2Vfbm9mZnNldCwgJmFyY2gpOworCQlwcmludGYgKCIlcyAgQXJjaGl0ZWN0dXJlOiAlc1xuIiwgcCwgZ2VuaW1nX2dldF9hcmNoX25hbWUgKGFyY2gpKTsKKwl9CisKKwlpZiAodHlwZSA9PSBJSF9UWVBFX0tFUk5FTCkgeworCQlmaXRfaW1hZ2VfZ2V0X29zIChmaXQsIGltYWdlX25vZmZzZXQsICZvcyk7CisJCXByaW50ZiAoIiVzICBPUzogICAgICAgICAgICVzXG4iLCBwLCBnZW5pbWdfZ2V0X29zX25hbWUgKG9zKSk7CisJfQorCisJaWYgKCh0eXBlID09IElIX1RZUEVfS0VSTkVMKSB8fCAodHlwZSA9PSBJSF9UWVBFX1NUQU5EQUxPTkUpIHx8CisJCSh0eXBlID09IElIX1RZUEVfRklSTVdBUkUpKSB7CisJCXJldCA9IGZpdF9pbWFnZV9nZXRfbG9hZCAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbG9hZCk7CisJCXByaW50ZiAoIiVzICBMb2FkIEFkZHJlc3M6ICIsIHApOworCQlpZiAocmV0KQorCQkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCQllbHNlCisJCQlwcmludGYgKCIweCUwOGx4XG4iLCBsb2FkKTsKKwl9CisKKwlpZiAoKHR5cGUgPT0gSUhfVFlQRV9LRVJORUwpIHx8ICh0eXBlID09IElIX1RZUEVfU1RBTkRBTE9ORSkpIHsKKwkJZml0X2ltYWdlX2dldF9lbnRyeSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZW50cnkpOworCQlwcmludGYgKCIlcyAgRW50cnkgUG9pbnQ6ICAiLCBwKTsKKwkJaWYgKHJldCkKKwkJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmICgiMHglMDhseFxuIiwgZW50cnkpOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGhhc2ggc3Vibm9kZXMgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJCQlmaXRfaW1hZ2VfcHJpbnRfaGFzaCAoZml0LCBub2Zmc2V0LCBwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBmaXRfaW1hZ2VfcHJpbnRfaGFzaCAtIHByaW50cyBvdXQgdGhlIGhhc2ggbm9kZSBkZXRhaWxzCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG9mZnNldCBvZiB0aGUgaGFzaCBub2RlCisgKiBAcDogcG9pbnRlciB0byBwcmVmaXggc3RyaW5nCisgKgorICogZml0X2ltYWdlX3ByaW50X2hhc2goKSBsaXN0cyBwcm9wZXJpZXMgZm9yIHRoZSBwcm9jZXNzZWQgaGFzaCBub2RlCisgKgorICogcmV0dXJuczoKKyAqICAgICBubyByZXR1cm5lZCByZXN1bHRzCisgKi8KK3ZvaWQgZml0X2ltYWdlX3ByaW50X2hhc2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNvbnN0IGNoYXIgKnApCit7CisJY2hhciAqYWxnbzsKKwl1aW50OF90ICp2YWx1ZTsKKwlpbnQgdmFsdWVfbGVuOworCWludCBpLCByZXQ7CisKKwkvKgorCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJICogTXVsdGlwbGUgaGFzaCBub2RlcyByZXF1aXJlIHVuaXF1ZSB1bml0IG5vZGUKKwkgKiBuYW1lcywgZS5nLiBoYXNoQDEsIGhhc2hAMiwgZXRjLgorCSAqLworCWlmIChzdHJuY21wIChmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCUZJVF9IQVNIX05PREVOQU1FLAorCQkJc3RybGVuKEZJVF9IQVNIX05PREVOQU1FKSkgIT0gMCkKKwkJcmV0dXJuOworCisJZGVidWcgKCIlcyAgSGFzaCBub2RlOiAgICAnJXMnXG4iLCBwLAorCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCXByaW50ZiAoIiVzICBIYXNoIGFsZ286ICAgICIsIHApOworCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJcHJpbnRmICgiaW52YWxpZC91bnN1cHBvcnRlZFxuIik7CisJCXJldHVybjsKKwl9CisJcHJpbnRmICgiJXNcbiIsIGFsZ28pOworCisJcmV0ID0gZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsICZ2YWx1ZSwKKwkJCQkJJnZhbHVlX2xlbik7CisJcHJpbnRmICgiJXMgIEhhc2ggdmFsdWU6ICAgIiwgcCk7CisJaWYgKHJldCkgeworCQlwcmludGYgKCJ1bmF2YWlsYWJsZVxuIik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IHZhbHVlX2xlbjsgaSsrKQorCQkJcHJpbnRmICgiJTAyeCIsIHZhbHVlW2ldKTsKKwkJcHJpbnRmICgiXG4iKTsKKwl9CisKKwlkZWJ1ZyAgKCIlcyAgSGFzaCBsZW46ICAgICAlZFxuIiwgcCwgdmFsdWVfbGVuKTsKK30KKworLyoqCisgKiBmaXRfZ2V0X2Rlc2MgLSBnZXQgbm9kZSBkZXNjcmlwdGlvbiBwcm9wZXJ0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBub2RlIG9mZnNldAorICogQGRlc2M6IGRvdWJsZSBwb2ludGVyIHRvIHRoZSBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byB0aGUgZGVzY3JwdGlvbgorICoKKyAqIGZpdF9nZXRfZGVzYygpIHJlYWRzIGRlc2NyaXB0aW9uIHByb3BlcnR5IGZyb20gYSBnaXZlbiBub2RlLCBpZgorICogZGVzY3JpcHRpb24gaXMgZm91bmQgcG9pbnRlciB0byBpdCBpcyByZXR1cmVuZWQgaW4gdGhpcmQgY2FsbCBhcmd1bWVudC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2dldF9kZXNjIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjaGFyICoqZGVzYykKK3sKKwlpbnQgbGVuOworCisJKmRlc2MgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9ERVNDX1BST1AsICZsZW4pOworCWlmICgqZGVzYyA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0RFU0NfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9nZXRfdGltZXN0YW1wIC0gZ2V0IG5vZGUgdGltZXN0YW1wIHByb3BlcnR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IG5vZGUgb2Zmc2V0CisgKiBAdGltZXN0YW1wOiBwb2ludGVyIHRvIHRoZSB0aW1lX3QsIHdpbGwgaG9sZCByZWFkIHRpbWVzdGFtcAorICoKKyAqIGZpdF9nZXRfdGltZXN0YW1wKCkgcmVhZHMgdGltZXN0YW1wIHBvcGVydHkgZnJvbSBnaXZlbiBub2RlLCBpZiB0aW1lc3RhbXAKKyAqIGlzIGZvdW5kIGFuZCBoYXMgYSBjb3JyZWN0IHNpemUgaXRzIHZhbHVlIGlzIHJldHVyZWQgaW4gdGhpcmQgY2FsbAorICogYXJndW1lbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIHByb3BlcnR5IHJlYWQgZmFpbHVyZQorICogICAgIC0yLCBvbiB3cm9uZyB0aW1lc3RhbXAgc2l6ZQorICovCitpbnQgZml0X2dldF90aW1lc3RhbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHRpbWVfdCAqdGltZXN0YW1wKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGxlbiAhPSBzaXplb2YgKHVpbnQzMl90KSkgeworCQlkZWJ1ZyAoIkZJVCB0aW1lc3RhbXAgd2l0aCBpbmNvcnJlY3Qgc2l6ZSBvZiAoJXUpXG4iLCBsZW4pOworCQlyZXR1cm4gLTI7CisJfQorCisJKnRpbWVzdGFtcCA9IHVpbWFnZV90b19jcHUgKCooKHVpbnQzMl90ICopZGF0YSkpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfbm9kZSAtIGdldCBub2RlIG9mZnNldCBmb3IgY29tcG9uZW50IGltYWdlIG9mIGEgZ2l2ZW4gdW5pdCBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX3VuYW1lOiBjb21wb25lbnQgaW1hZ2Ugbm9kZSB1bml0IG5hbWUKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X25vZGUoKSBmaW5kcyBhIGNvbXBvbmVudCBpbWFnZSAod2l0aGluZyB0aGUgJy9pbWFnZXMnCisgKiBub2RlKSBvZiBhIHByb3ZpZGVkIHVuaXQgbmFtZS4gSWYgaW1hZ2UgaXMgZm91bmQgaXRzIG5vZGUgb2Zmc2V0IGlzCisgKiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2Ugbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBjb25zdCBjaGFyICppbWFnZV91bmFtZSkKK3sKKwlpbnQgbm9mZnNldCwgaW1hZ2VzX25vZmZzZXQ7CisKKwlpbWFnZXNfbm9mZnNldCA9IGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpOworCWlmIChpbWFnZXNfbm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIGltYWdlc19ub2Zmc2V0OworCX0KKworCW5vZmZzZXQgPSBmZHRfc3Vibm9kZV9vZmZzZXQgKGZpdCwgaW1hZ2VzX25vZmZzZXQsIGltYWdlX3VuYW1lKTsKKwlpZiAobm9mZnNldCA8IDApIHsKKwkJZGVidWcgKCJDYW4ndCBnZXQgbm9kZSBvZmZzZXQgZm9yIGltYWdlIHVuaXQgbmFtZTogJyVzJyAoJXMpXG4iLAorCQkJaW1hZ2VfdW5hbWUsIGZkdF9zdHJlcnJvciAobm9mZnNldCkpOworCX0KKworCXJldHVybiBub2Zmc2V0OworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfb3MgLSBnZXQgb3MgaWQgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAb3M6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBvcyBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF9vcygpIGZpbmRzIG9zIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpvcykKK3sKKwlpbnQgbGVuOworCWNvbnN0IHZvaWQgKmRhdGE7CisKKwkvKiBHZXQgT1MgbmFtZSBmcm9tIHByb3BlcnR5IGRhdGEgKi8KKwlkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX09TX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfT1NfUFJPUCwgbGVuKTsKKwkJKm9zID0gLTE7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBUcmFuc2xhdGUgT1MgbmFtZSB0byBpZCAqLworCSpvcyA9IGdlbmltZ19nZXRfb3NfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfYXJjaCAtIGdldCBhcmNoIGlkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGFyY2g6IHBvaW50ZXIgdG8gdGhlIHVpbnQ4X3QsIHdpbGwgaG9sZCBhcmNoIG51bWVyaWMgaWQKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2FyY2goKSBmaW5kcyBhcmNoIHByb3BlcnR5IGluIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUuCisgKiBJZiB0aGUgcHJvcGVydHkgaXMgZm91bmQsIGl0cyAoc3RyaW5nKSB2YWx1ZSBpcyB0cmFuc2xhdGVkIHRvIHRoZSBudW1lcmljCisgKiBpZCB3aGljaCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKmFyY2gpCit7CisJaW50IGxlbjsKKwljb25zdCB2b2lkICpkYXRhOworCisJLyogR2V0IGFyY2hpdGVjdHVyZSBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQVJDSF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0FSQ0hfUFJPUCwgbGVuKTsKKwkJKmFyY2ggPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBhcmNoaXRlY3R1cmUgbmFtZSB0byBpZCAqLworCSphcmNoID0gZ2VuaW1nX2dldF9hcmNoX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X3R5cGUgLSBnZXQgdHlwZSBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEB0eXBlOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgdHlwZSBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF90eXBlKCkgZmluZHMgdHlwZSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF90eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp0eXBlKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBpbWFnZSB0eXBlIG5hbWUgZnJvbSBwcm9wZXJ0eSBkYXRhICovCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9UWVBFX1BST1AsICZsZW4pOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfVFlQRV9QUk9QLCBsZW4pOworCQkqdHlwZSA9IC0xOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogVHJhbnNsYXRlIGltYWdlIHR5cGUgbmFtZSB0byBpZCAqLworCSp0eXBlID0gZ2VuaW1nX2dldF90eXBlX2lkIChkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfZ2V0X2NvbXAgLSBnZXQgY29tcCBpZCBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBjb21wOiBwb2ludGVyIHRvIHRoZSB1aW50OF90LCB3aWxsIGhvbGQgY29tcCBudW1lcmljIGlkCisgKgorICogZml0X2ltYWdlX2dldF9jb21wKCkgZmluZHMgY29tcCBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kLCBpdHMgKHN0cmluZykgdmFsdWUgaXMgdHJhbnNsYXRlZCB0byB0aGUgbnVtZXJpYworICogaWQgd2hpY2ggaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2dldF9jb21wIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpjb21wKQoreworCWludCBsZW47CisJY29uc3Qgdm9pZCAqZGF0YTsKKworCS8qIEdldCBjb21wcmVzc2lvbiBuYW1lIGZyb20gcHJvcGVydHkgZGF0YSAqLworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfQ09NUF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0NPTVBfUFJPUCwgbGVuKTsKKwkJKmNvbXAgPSAtMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFRyYW5zbGF0ZSBjb21wcmVzc2lvbiBuYW1lIHRvIGlkICovCisJKmNvbXAgPSBnZW5pbWdfZ2V0X2NvbXBfaWQgKGRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfbG9hZCAtIGdldCBsb2FkIGFkZHJlc3MgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGltYWdlIG5vZGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAbG9hZDogcG9pbnRlciB0byB0aGUgdWludDMyX3QsIHdpbGwgaG9sZCBsb2FkIGFkZHJlc3MKKyAqCisgKiBmaXRfaW1hZ2VfZ2V0X2xvYWQoKSBmaW5kcyBsb2FkIGFkZHJlc3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfbG9hZCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmxvYWQpCit7CisJaW50IGxlbjsKKwljb25zdCB1aW50MzJfdCAqZGF0YTsKKworCWRhdGEgPSBmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfTE9BRF9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0xPQURfUFJPUCwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSpsb2FkID0gdWltYWdlX3RvX2NwdSAoKmRhdGEpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGZpdF9pbWFnZV9nZXRfZW50cnkgLSBnZXQgZW50cnkgcG9pbnQgYWRkcmVzcyBwcm9wZXJ0eSBmb3IgYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBjb21wb25lbnQgaW1hZ2Ugbm9kZSBvZmZzZXQKKyAqIEBlbnRyeTogcG9pbnRlciB0byB0aGUgdWludDMyX3QsIHdpbGwgaG9sZCBlbnRyeSBwb2ludCBhZGRyZXNzCisgKgorICogZml0X2ltYWdlX2dldF9lbnRyeSgpIGZpbmRzIGVudHJ5IHBvaW50IGFkZHJlc3MgcHJvcGVydHkgaW4gYSBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKyAqIElmIHRoZSBwcm9wZXJ0eSBpcyBmb3VuZCwgaXRzIHZhbHVlIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9nZXRfZW50cnkgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVsb25nICplbnRyeSkKK3sKKwlpbnQgbGVuOworCWNvbnN0IHVpbnQzMl90ICpkYXRhOworCisJZGF0YSA9IGZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9FTlRSWV9QUk9QLCAmbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX0VOVFJZX1BST1AsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqZW50cnkgPSB1aW1hZ2VfdG9fY3B1ICgqZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2dldF9kYXRhIC0gZ2V0IGRhdGEgcHJvcGVydHkgYW5kIGl0cyBzaXplIGZvciBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGRhdGE6IGRvdWJsZSBwb2ludGVyIHRvIHZvaWQsIHdpbGwgaG9sZCBkYXRhIHByb3BlcnR5J3MgZGF0YSBhZGRyZXNzCisgKiBAc2l6ZTogcG9pbnRlciB0byBzaXplX3QsIHdpbGwgaG9sZCBkYXRhIHByb3BlcnR5J3MgZGF0YSBzaXplCisgKgorICogZml0X2ltYWdlX2dldF9kYXRhKCkgZmluZHMgZGF0YSBwcm9wZXJ0eSBpbiBhIGdpdmVuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgYXJlIHJldHVybmVkIHRvCisgKiB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfZ2V0X2RhdGEgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCWNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpCit7CisJaW50IGxlbjsKKworCSpkYXRhID0gZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0RBVEFfUFJPUCwgJmxlbik7CisJaWYgKCpkYXRhID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfREFUQV9QUk9QLCBsZW4pOworCQkqc2l6ZSA9IDA7CisJCXJldHVybiAtMTsKKwl9CisKKwkqc2l6ZSA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAtIGdldCBoYXNoIGFsZ29yaXRobSBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEBhbGdvOiBkb3VibGUgcG9pbnRlciB0byBjaGFyLCB3aWxsIGhvbGQgcG9pbnRlciB0byB0aGUgYWxnb3JpdGhtIG5hbWUKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbygpIGZpbmRzIGhhc2ggYWxnb3JpdGhtIHByb3BlcnR5IGluIGEgZ2l2ZW4gaGFzaCBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX2hhc2hfZ2V0X2FsZ28gKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKiphbGdvKQoreworCWludCBsZW47CisKKwkqYWxnbyA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX0FMR09fUFJPUCwgJmxlbik7CisJaWYgKCphbGdvID09IE5VTEwpIHsKKwkJZml0X2dldF9kZWJ1ZyAoZml0LCBub2Zmc2V0LCBGSVRfQUxHT19QUk9QLCBsZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2hhc2hfZ2V0X3ZhbHVlIC0gZ2V0IGhhc2ggdmFsdWUgYW5kIGxlbmd0aAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBoYXNoIG5vZGUgb2Zmc2V0CisgKiBAdmFsdWU6IGRvdWJsZSBwb2ludGVyIHRvIHVpbnQ4X3QsIHdpbGwgaG9sZCBhZGRyZXNzIG9mIGEgaGFzaCB2YWx1ZSBkYXRhCisgKiBAdmFsdWVfbGVuOiBwb2ludGVyIHRvIGFuIGludCwgd2lsbCBob2xkIGhhc2ggZGF0YSBsZW5ndGgKKyAqCisgKiBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUoKSBmaW5kcyBoYXNoIHZhbHVlIHByb3BlcnR5IGluIGEgZ2l2ZW4gaGFzaCBub2RlLgorICogSWYgdGhlIHByb3BlcnR5IGlzIGZvdW5kIGl0cyBkYXRhIHN0YXJ0IGFkZHJlc3MgYW5kIHNpemUgYXJlIHJldHVybmVkIHRvCisgKiB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMCwgb24gc3VjY2VzcworICogICAgIC0xLCBvbiBmYWlsdXJlCisgKi8KK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfdmFsdWUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKip2YWx1ZSwKKwkJCQlpbnQgKnZhbHVlX2xlbikKK3sKKwlpbnQgbGVuOworCisJKnZhbHVlID0gKHVpbnQ4X3QgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVkFMVUVfUFJPUCwgJmxlbik7CisJaWYgKCp2YWx1ZSA9PSBOVUxMKSB7CisJCWZpdF9nZXRfZGVidWcgKGZpdCwgbm9mZnNldCwgRklUX1ZBTFVFX1BST1AsIGxlbik7CisJCSp2YWx1ZV9sZW4gPSAwOworCQlyZXR1cm4gLTE7CisJfQorCisJKnZhbHVlX2xlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfc2V0X3RpbWVzdGFtcCAtIHNldCBub2RlIHRpbWVzdGFtcCBwcm9wZXJ0eQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBub2RlIG9mZnNldAorICogQHRpbWVzdGFtcDogdGltZXN0YW1wIHZhbHVlIHRvIGJlIHNldAorICoKKyAqIGZpdF9zZXRfdGltZXN0YW1wKCkgYXR0ZW1wdHMgdG8gc2V0IHRpbWVzdGFtcCBwcm9wZXJ0eSBpbiB0aGUgcmVxdWVzdGVkCisgKiBub2RlIGFuZCByZXR1cm5zIG9wZXJhdGlvbiBzdGF0dXMgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDAsIG9uIHN1Y2Nlc3MKKyAqICAgICAtMSwgb24gcHJvcGVydHkgcmVhZCBmYWlsdXJlCisgKi8KK2ludCBmaXRfc2V0X3RpbWVzdGFtcCAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90IHRpbWVzdGFtcCkKK3sKKwl1aW50MzJfdCB0OworCWludCByZXQ7CisKKwl0ID0gY3B1X3RvX3VpbWFnZSAodGltZXN0YW1wKTsKKwlyZXQgPSBmZHRfc2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfVElNRVNUQU1QX1BST1AsICZ0LAorCQkJCXNpemVvZiAodWludDMyX3QpKTsKKwlpZiAocmV0KSB7CisJCXByaW50ZiAoIkNhbid0IHNldCAnJXMnIHByb3BlcnR5IGZvciAnJXMnIG5vZGUgKCVzKVxuIiwKKwkJCUZJVF9USU1FU1RBTVBfUFJPUCwgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZmR0X3N0cmVycm9yIChyZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGNhbGN1bGF0ZV9oYXNoIC0gY2FsY3VsYXRlIGFuZCByZXR1cm4gaGFzaCBmb3IgcHJvdmlkZWQgaW5wdXQgZGF0YQorICogQGRhdGE6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEKKyAqIEBkYXRhX2xlbjogZGF0YSBsZW5ndGgKKyAqIEBhbGdvOiByZXF1ZXN0ZWQgaGFzaCBhbGdvcml0aG0KKyAqIEB2YWx1ZTogcG9pbnRlciB0byB0aGUgY2hhciwgd2lsbCBob2xkIGhhc2ggdmFsdWUgZGF0YSAoY2FsbGVyIG11c3QKKyAqIGFsbG9jYXRlIGVub3VnaCBmcmVlIHNwYWNlKQorICogdmFsdWVfbGVuOiBsZW5ndGggb2YgdGhlIGNhbGN1bGF0ZWQgaGFzaAorICoKKyAqIGNhbGN1bGF0ZV9oYXNoKCkgY29tcHV0ZXMgaW5wdXQgZGF0YSBoYXNoIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGFsZ29yaXRobS4KKyAqIFJlc3VsdGluZyBoYXNoIHZhbHVlIGlzIHBsYWNlZCBpbiBjYWxsZXIgcHJvdmlkZWQgJ3ZhbHVlJyBidWZmZXIsIGxlbmd0aAorICogb2YgdGhlIGNhbGN1bGF0ZWQgaGFzaCBpcyByZXR1cm5lZCB2aWEgdmFsdWVfbGVuIHBvaW50ZXIgYXJndW1lbnQuCisgKgorICogcmV0dXJuczoKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAtMSwgd2hlbiBhbGdvIGlzIHVuc3VwcG9ydGVkCisgKi8KK3N0YXRpYyBpbnQgY2FsY3VsYXRlX2hhc2ggKGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhX2xlbiwgY29uc3QgY2hhciAqYWxnbywKKwkJCXVpbnQ4X3QgKnZhbHVlLCBpbnQgKnZhbHVlX2xlbikKK3sKKwlpZiAoc3RyY21wIChhbGdvLCAiY3JjMzIiKSA9PSAwICkgeworCQkqKCh1aW50MzJfdCAqKXZhbHVlKSA9IGNyYzMyX3dkICgwLCBkYXRhLCBkYXRhX2xlbiwKKwkJCQkJCQlDSFVOS1NaX0NSQzMyKTsKKwkJKigodWludDMyX3QgKil2YWx1ZSkgPSBjcHVfdG9fdWltYWdlICgqKCh1aW50MzJfdCAqKXZhbHVlKSk7CisJCSp2YWx1ZV9sZW4gPSA0OworCX0gZWxzZSBpZiAoc3RyY21wIChhbGdvLCAic2hhMSIpID09IDAgKSB7CisJCXNoYTFfY3N1bV93ZCAoKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgZGF0YV9sZW4sCisJCQkJKHVuc2lnbmVkIGNoYXIgKikgdmFsdWUsIENIVU5LU1pfU0hBMSk7CisJCSp2YWx1ZV9sZW4gPSAyMDsKKwl9IGVsc2UgaWYgKHN0cmNtcCAoYWxnbywgIm1kNSIpID09IDAgKSB7CisJCW1kNV93ZCAoKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBkYXRhX2xlbiwgdmFsdWUsIENIVU5LU1pfTUQ1KTsKKwkJKnZhbHVlX2xlbiA9IDE2OworCX0gZWxzZSB7CisJCWRlYnVnICgiVW5zdXBwb3J0ZWQgaGFzaCBhbG9ncml0aG1cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgVVNFX0hPU1RDQworLyoqCisgKiBmaXRfc2V0X2hhc2hlcyAtIHByb2Nlc3MgRklUIGNvbXBvbmVudCBpbWFnZSBub2RlcyBhbmQgY2FsY3VsYXRlIGhhc2hlcworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiBmaXRfc2V0X2hhc2hlcygpIGFkZHMgaGFzaCB2YWx1ZXMgZm9yIGFsbCBjb21wb25lbnQgaW1hZ2VzIGluIHRoZSBGSVQgYmxvYi4KKyAqIEhhc2hlcyBhcmUgY2FsY3VsYXRlZCBmb3IgYWxsIGNvbXBvbmVudCBpbWFnZXMgd2hpY2ggaGF2ZSBoYXNoIHN1Ym5vZGVzCisgKiB3aXRoIGFsZ29yaXRobSBwcm9wZXJ0eSBzZXQgdG8gb25lIG9mIHRoZSBzdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG1zLgorICoKKyAqIHJldHVybnMKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgbGliZmR0IGVycm9yIGNvZGUsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9zZXRfaGFzaGVzICh2b2lkICpmaXQpCit7CisJaW50IGltYWdlc19ub2Zmc2V0OworCWludCBub2Zmc2V0OworCWludCBuZGVwdGg7CisJaW50IHJldDsKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIGltYWdlc19ub2Zmc2V0OworCX0KKworCS8qIFByb2Nlc3MgaXRzIHN1Ym5vZGVzLCBwcmludCBvdXQgY29tcG9uZW50IGltYWdlcyBkZXRhaWxzICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZXNfbm9mZnNldCwgJm5kZXB0aCk7CisJICAgICAobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJICAgICBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBub2Zmc2V0LCAmbmRlcHRoKSkgeworCQlpZiAobmRlcHRoID09IDEpIHsKKwkJCS8qCisJCQkgKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgaW1hZ2VzIHBhcmVudCBub2RlLAorCQkJICogaS5lLiBjb21wb25lbnQgaW1hZ2Ugbm9kZS4KKwkJCSAqLworCQkJcmV0ID0gZml0X2ltYWdlX3NldF9oYXNoZXMgKGZpdCwgbm9mZnNldCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAtIGNhbGN1bGF0ZS9zZXQgaGFzaGVzIGZvciBnaXZlbiBjb21wb25lbnQgaW1hZ2Ugbm9kZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBpbWFnZV9ub2Zmc2V0OiByZXF1ZXN0ZWQgY29tcG9uZW50IGltYWdlIG5vZGUKKyAqCisgKiBmaXRfaW1hZ2Vfc2V0X2hhc2hlcygpIGFkZHMgaGFzaCB2YWx1ZXMgZm9yIGFuIGNvbXBvbmVudCBpbWFnZSBub2RlLiBBbGwKKyAqIGV4aXN0aW5nIGhhc2ggc3Vibm9kZXMgYXJlIGNoZWNrZWQsIGlmIGFsZ29yaXRobSBwcm9wZXJ0eSBpcyBzZXQgdG8gb25lIG9mCisgKiB0aGUgc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtcywgaGFzaCB2YWx1ZSBpcyBjb21wdXRlZCBhbmQgY29ycmVzcG9uZGluZworICogaGFzaCBub2RlIHByb3BlcnR5IGlzIHNldCwgZm9yIGV4YW1wbGU6CisgKgorICogSW5wdXQgY29tcG9uZW50IGltYWdlIG5vZGUgc3RydWN0dXJlOgorICoKKyAqIG8gaW1hZ2VAMSAoYXQgaW1hZ2Vfbm9mZnNldCkKKyAqICAgfCAtIGRhdGEgPSBbYmluYXJ5IGRhdGFdCisgKiAgIG8gaGFzaEAxCisgKiAgICAgfC0gYWxnbyA9ICJzaGExIgorICoKKyAqIE91dHB1dCBjb21wb25lbnQgaW1hZ2Ugbm9kZSBzdHJ1Y3R1cmU6CisgKgorICogbyBpbWFnZUAxIChhdCBpbWFnZV9ub2Zmc2V0KQorICogICB8IC0gZGF0YSA9IFtiaW5hcnkgZGF0YV0KKyAqICAgbyBoYXNoQDEKKyAqICAgICB8LSBhbGdvID0gInNoYTEiCisgKiAgICAgfC0gdmFsdWUgPSBzaGExKGRhdGEpCisgKgorICogcmV0dXJuczoKKyAqICAgICAwIG9uIHN1Y2VzcworICogICAgPDAgb24gZmFpbHVyZQorICovCitpbnQgZml0X2ltYWdlX3NldF9oYXNoZXMgKHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQpCit7CisJY29uc3Qgdm9pZCAqZGF0YTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICphbGdvOworCXVpbnQ4X3QgdmFsdWVbRklUX01BWF9IQVNIX0xFTl07CisJaW50IHZhbHVlX2xlbjsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCisJLyogR2V0IGltYWdlIGRhdGEgYW5kIGRhdGEgbGVuZ3RoICovCisJaWYgKGZpdF9pbWFnZV9nZXRfZGF0YSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmZGF0YSwgJnNpemUpKSB7CisJCXByaW50ZiAoIkNhbid0IGdldCBpbWFnZSBkYXRhL3NpemVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaGFzaCBzdWJub2RlcyBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKwlmb3IgKG5kZXB0aCA9IDAsIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIGltYWdlX25vZmZzZXQsICZuZGVwdGgpOworCSAgICAgKG5vZmZzZXQgPj0gMCkgJiYgKG5kZXB0aCA+IDApOworCSAgICAgbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgbm9mZnNldCwgJm5kZXB0aCkpIHsKKwkJaWYgKG5kZXB0aCA9PSAxKSB7CisJCQkvKiBEaXJlY3QgY2hpbGQgbm9kZSBvZiB0aGUgY29tcG9uZW50IGltYWdlIG5vZGUgKi8KKworCQkJLyoKKwkJCSAqIENoZWNrIHN1Ym5vZGUgbmFtZSwgbXVzdCBiZSBlcXVhbCB0byAiaGFzaCIuCisJCQkgKiBNdWx0aXBsZSBoYXNoIG5vZGVzIHJlcXVpcmUgdW5pcXVlIHVuaXQgbm9kZQorCQkJICogbmFtZXMsIGUuZy4gaGFzaEAxLCBoYXNoQDIsIGV0Yy4KKwkJCSAqLworCQkJaWYgKHN0cm5jbXAgKGZpdF9nZXRfbmFtZShmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQkJCQlzdHJsZW4oRklUX0hBU0hfTk9ERU5BTUUpKSAhPSAwKSB7CisJCQkJLyogTm90IGEgaGFzaCBzdWJub2RlLCBza2lwIGl0ICovCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJCQlwcmludGYgKCJDYW4ndCBnZXQgaGFzaCBhbGdvIHByb3BlcnR5IGZvciAiCisJCQkJCSInJXMnIGhhc2ggbm9kZSBpbiAnJXMnIGltYWdlIG5vZGVcbiIsCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChjYWxjdWxhdGVfaGFzaCAoZGF0YSwgc2l6ZSwgYWxnbywgdmFsdWUsICZ2YWx1ZV9sZW4pKSB7CisJCQkJcHJpbnRmICgiVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0gKCVzKSBmb3IgIgorCQkJCQkiJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJCQlhbGdvLCBmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlpZiAoZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlIChmaXQsIG5vZmZzZXQsIHZhbHVlLAorCQkJCQkJCXZhbHVlX2xlbikpIHsKKwkJCQlwcmludGYgKCJDYW4ndCBzZXQgaGFzaCB2YWx1ZSBmb3IgIgorCQkJCQkiJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJCQlmaXRfZ2V0X25hbWUgKGZpdCwgbm9mZnNldCwgTlVMTCksCisJCQkJCWZpdF9nZXRfbmFtZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCBOVUxMKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlIC0gc2V0IGhhc2ggdmFsdWUgaW4gcmVxdWVzdGVkIGhhcyBub2RlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGhhc2ggbm9kZSBvZmZzZXQKKyAqIEB2YWx1ZTogaGFzaCB2YWx1ZSB0byBiZSBzZXQKKyAqIEB2YWx1ZV9sZW46IGhhc2ggdmFsdWUgbGVuZ3RoCisgKgorICogZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlKCkgYXR0ZW1wdHMgdG8gc2V0IGhhc2ggdmFsdWUgaW4gYSBub2RlIGF0IG9mZnNldAorICogZ2l2ZW4gYW5kIHJldHVybnMgb3BlcmF0aW9uIHN0YXR1cyB0byB0aGUgY2FsbGVyLgorICoKKyAqIHJldHVybnMKKyAqICAgICAwLCBvbiBzdWNjZXNzCisgKiAgICAgLTEsIG9uIGZhaWx1cmUKKyAqLworaW50IGZpdF9pbWFnZV9oYXNoX3NldF92YWx1ZSAodm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqdmFsdWUsCisJCQkJaW50IHZhbHVlX2xlbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZmR0X3NldHByb3AgKGZpdCwgbm9mZnNldCwgRklUX1ZBTFVFX1BST1AsIHZhbHVlLCB2YWx1ZV9sZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRmICgiQ2FuJ3Qgc2V0IGhhc2ggJyVzJyBwcm9wZXJ0eSBmb3IgJyVzJyBub2RlICglcylcbiIsCisJCQlGSVRfVkFMVUVfUFJPUCwgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZmR0X3N0cmVycm9yIChyZXQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIC0gdmVyaWZ5IGRhdGEgaW50ZXJnaXR5CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGltYWdlX25vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICoKKyAqIGZpdF9pbWFnZV9jaGVja19oYXNoZXMoKSBnb2VzIG92ZXIgY29tcG9uZW50IGltYWdlIGhhc2ggbm9kZXMsCisgKiByZS1jYWxjdWxhdGVzIGVhY2ggZGF0YSBoYXNoIGFuZCBjb21wYXJlcyB3aXRoIHRoZSB2YWx1ZSBzdG9yZWQgaW4gaGFzaAorICogbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIGlmIGFsbCBoYXNoZXMgYXJlIHZhbGlkCisgKiAgICAgMCwgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCwgaW50IGltYWdlX25vZmZzZXQpCit7CisJY29uc3Qgdm9pZAkqZGF0YTsKKwlzaXplX3QJCXNpemU7CisJY2hhcgkJKmFsZ287CisJdWludDhfdAkJKmZpdF92YWx1ZTsKKwlpbnQJCWZpdF92YWx1ZV9sZW47CisJdWludDhfdAkJdmFsdWVbRklUX01BWF9IQVNIX0xFTl07CisJaW50CQl2YWx1ZV9sZW47CisJaW50CQlub2Zmc2V0OworCWludAkJbmRlcHRoOworCWNoYXIJCSplcnJfbXNnID0gIiI7CisKKwkvKiBHZXQgaW1hZ2UgZGF0YSBhbmQgZGF0YSBsZW5ndGggKi8KKwlpZiAoZml0X2ltYWdlX2dldF9kYXRhIChmaXQsIGltYWdlX25vZmZzZXQsICZkYXRhLCAmc2l6ZSkpIHsKKwkJcHJpbnRmICgiQ2FuJ3QgZ2V0IGltYWdlIGRhdGEvc2l6ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFByb2Nlc3MgYWxsIGhhc2ggc3Vibm9kZXMgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisJZm9yIChuZGVwdGggPSAwLCBub2Zmc2V0ID0gZmR0X25leHRfbm9kZSAoZml0LCBpbWFnZV9ub2Zmc2V0LCAmbmRlcHRoKTsKKwkgICAgIChub2Zmc2V0ID49IDApICYmIChuZGVwdGggPiAwKTsKKwkgICAgIG5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyogRGlyZWN0IGNoaWxkIG5vZGUgb2YgdGhlIGNvbXBvbmVudCBpbWFnZSBub2RlICovCisKKwkJCS8qCisJCQkgKiBDaGVjayBzdWJub2RlIG5hbWUsIG11c3QgYmUgZXF1YWwgdG8gImhhc2giLgorCQkJICogTXVsdGlwbGUgaGFzaCBub2RlcyByZXF1aXJlIHVuaXF1ZSB1bml0IG5vZGUKKwkJCSAqIG5hbWVzLCBlLmcuIGhhc2hAMSwgaGFzaEAyLCBldGMuCisJCQkgKi8KKwkJCWlmIChzdHJuY21wIChmaXRfZ2V0X25hbWUoZml0LCBub2Zmc2V0LCBOVUxMKSwKKwkJCQkJRklUX0hBU0hfTk9ERU5BTUUsCisJCQkJCXN0cmxlbihGSVRfSEFTSF9OT0RFTkFNRSkpICE9IDApCisJCQkJY29udGludWU7CisKKwkJCWlmIChmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoZml0LCBub2Zmc2V0LCAmYWxnbykpIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcbkNhbid0IGdldCBoYXNoIGFsZ28gIgorCQkJCQkJInByb3BlcnR5IjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJcHJpbnRmICgiJXMiLCBhbGdvKTsKKworCQkJaWYgKGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoZml0LCBub2Zmc2V0LCAmZml0X3ZhbHVlLAorCQkJCQkJCSZmaXRfdmFsdWVfbGVuKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuQ2FuJ3QgZ2V0IGhhc2ggdmFsdWUgIgorCQkJCQkJInByb3BlcnR5IjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCisJCQlpZiAoY2FsY3VsYXRlX2hhc2ggKGRhdGEsIHNpemUsIGFsZ28sIHZhbHVlLCAmdmFsdWVfbGVuKSkgeworCQkJCWVycl9tc2cgPSAiIGVycm9yIVxuVW5zdXBwb3J0ZWQgaGFzaCBhbGdvcml0aG0iOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCWlmICh2YWx1ZV9sZW4gIT0gZml0X3ZhbHVlX2xlbikgeworCQkJCWVycl9tc2cgPSAiIGVycm9yICFcbkJhZCBoYXNoIHZhbHVlIGxlbiI7CisJCQkJZ290byBlcnJvcjsKKwkJCX0gZWxzZSBpZiAobWVtY21wICh2YWx1ZSwgZml0X3ZhbHVlLCB2YWx1ZV9sZW4pICE9IDApIHsKKwkJCQllcnJfbXNnID0gIiBlcnJvciFcbkJhZCBoYXNoIHZhbHVlIjsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJcHJpbnRmICgiKyAiKTsKKwkJfQorCX0KKworCXJldHVybiAxOworCitlcnJvcjoKKwlwcmludGYgKCIlcyBmb3IgJyVzJyBoYXNoIG5vZGUgaW4gJyVzJyBpbWFnZSBub2RlXG4iLAorCQkJZXJyX21zZywgZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpLAorCQkJZml0X2dldF9uYW1lIChmaXQsIGltYWdlX25vZmZzZXQsIE5VTEwpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcyAtIHZlcmlmeSBkYXRhIGludGVyZ2l0eSBmb3IgYWxsIGltYWdlcworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcygpIGdvZXMgb3ZlciBhbGwgaW1hZ2VzIGluIHRoZSBGSVQgYW5kCisgKiBmb3IgZXZlcnkgaW1hZ2VzIGNoZWNrcyBpZiBhbGwgaXQncyBoYXNoZXMgYXJlIHZhbGlkLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgMSwgaWYgYWxsIGhhc2hlcyBvZiBhbGwgaW1hZ2VzIGFyZSB2YWxpZAorICogICAgIDAsIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfYWxsX2ltYWdlX2NoZWNrX2hhc2hlcyAoY29uc3Qgdm9pZCAqZml0KQoreworCWludCBpbWFnZXNfbm9mZnNldDsKKwlpbnQgbm9mZnNldDsKKwlpbnQgbmRlcHRoOworCWludCBjb3VudDsKKworCS8qIEZpbmQgaW1hZ2VzIHBhcmVudCBub2RlIG9mZnNldCAqLworCWltYWdlc19ub2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0IChmaXQsIEZJVF9JTUFHRVNfUEFUSCk7CisJaWYgKGltYWdlc19ub2Zmc2V0IDwgMCkgeworCQlwcmludGYgKCJDYW4ndCBmaW5kIGltYWdlcyBwYXJlbnQgbm9kZSAnJXMnICglcylcbiIsCisJCQlGSVRfSU1BR0VTX1BBVEgsIGZkdF9zdHJlcnJvciAoaW1hZ2VzX25vZmZzZXQpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUHJvY2VzcyBhbGwgaW1hZ2Ugc3Vibm9kZXMsIGNoZWNrIGhhc2hlcyBmb3IgZWFjaCAqLworCXByaW50ZiAoIiMjIENoZWNraW5nIGhhc2goZXMpIGZvciBGSVQgSW1hZ2UgYXQgJTA4bHggLi4uXG4iLAorCQkodWxvbmcpZml0KTsKKwlmb3IgKG5kZXB0aCA9IDAsIGNvdW50ID0gMCwKKwkJbm9mZnNldCA9IGZkdF9uZXh0X25vZGUgKGZpdCwgaW1hZ2VzX25vZmZzZXQsICZuZGVwdGgpOworCQkobm9mZnNldCA+PSAwKSAmJiAobmRlcHRoID4gMCk7CisJCW5vZmZzZXQgPSBmZHRfbmV4dF9ub2RlIChmaXQsIG5vZmZzZXQsICZuZGVwdGgpKSB7CisJCWlmIChuZGVwdGggPT0gMSkgeworCQkJLyoKKwkJCSAqIERpcmVjdCBjaGlsZCBub2RlIG9mIHRoZSBpbWFnZXMgcGFyZW50IG5vZGUsCisJCQkgKiBpLmUuIGNvbXBvbmVudCBpbWFnZSBub2RlLgorCQkJICovCisJCQlwcmludGYgKCIgICBIYXNoKGVzKSBmb3IgSW1hZ2UgJXUgKCVzKTogIiwgY291bnQrKywKKwkJCQkJZml0X2dldF9uYW1lIChmaXQsIG5vZmZzZXQsIE5VTEwpKTsKKworCQkJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfaGFzaGVzIChmaXQsIG5vZmZzZXQpKQorCQkJCXJldHVybiAwOworCQkJcHJpbnRmICgiXG4iKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfb3MgLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgaXMgb2YgYSBnaXZlbiBvcyB0eXBlCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQG9zOiByZXF1ZXN0ZWQgaW1hZ2Ugb3MKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfb3MoKSByZWFkcyBpbWFnZSBvcyBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzIG51bWVyaWMKKyAqIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBvcy4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gb3MgdHlwZQorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBvcykKK3sKKwl1aW50OF90IGltYWdlX29zOworCisJaWYgKGZpdF9pbWFnZV9nZXRfb3MgKGZpdCwgbm9mZnNldCwgJmltYWdlX29zKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChvcyA9PSBpbWFnZV9vcyk7Cit9CisKKy8qKgorICogZml0X2ltYWdlX2NoZWNrX2FyY2ggLSBjaGVjayB3aGV0aGVyIGltYWdlIG5vZGUgaXMgb2YgYSBnaXZlbiBhcmNoCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGFyY2g6IHJlcXVlc3RlZCBpbWFnZWFyY2gKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfYXJjaCgpIHJlYWRzIGltYWdlIGFyY2ggcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cyBudW1lcmljCisgKiBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgYXJjaC4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gYXJjaAorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja19hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IGFyY2gpCit7CisJdWludDhfdCBpbWFnZV9hcmNoOworCisJaWYgKGZpdF9pbWFnZV9nZXRfYXJjaCAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfYXJjaCkpCisJCXJldHVybiAwOworCXJldHVybiAoYXJjaCA9PSBpbWFnZV9hcmNoKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfdHlwZSAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSBpcyBvZiBhIGdpdmVuIHR5cGUKKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29tcG9uZW50IGltYWdlIG5vZGUgb2Zmc2V0CisgKiBAdHlwZTogcmVxdWVzdGVkIGltYWdlIHR5cGUKKyAqCisgKiBmaXRfaW1hZ2VfY2hlY2tfdHlwZSgpIHJlYWRzIGltYWdlIHR5cGUgcHJvcGVydHkgYW5kIGNvbXBhcmVzIGl0cyBudW1lcmljCisgKiBpZCB3aXRoIHRoZSByZXF1ZXN0ZWQgdHlwZS4gQ29tcGFyaXNvbiByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgaXMgb2YgZ2l2ZW4gdHlwZQorICogICAgIDAgb3RoZXJ3aXNlIChvciBvbiBlcnJvcikKKyAqLworaW50IGZpdF9pbWFnZV9jaGVja190eXBlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90IHR5cGUpCit7CisJdWludDhfdCBpbWFnZV90eXBlOworCisJaWYgKGZpdF9pbWFnZV9nZXRfdHlwZSAoZml0LCBub2Zmc2V0LCAmaW1hZ2VfdHlwZSkpCisJCXJldHVybiAwOworCXJldHVybiAodHlwZSA9PSBpbWFnZV90eXBlKTsKK30KKworLyoqCisgKiBmaXRfaW1hZ2VfY2hlY2tfY29tcCAtIGNoZWNrIHdoZXRoZXIgaW1hZ2Ugbm9kZSB1c2VzIGdpdmVuIGNvbXByZXNzaW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbXBvbmVudCBpbWFnZSBub2RlIG9mZnNldAorICogQGNvbXA6IHJlcXVlc3RlZCBpbWFnZSBjb21wcmVzc2lvbiB0eXBlCisgKgorICogZml0X2ltYWdlX2NoZWNrX2NvbXAoKSByZWFkcyBpbWFnZSBjb21wcmVzc2lvbiBwcm9wZXJ0eSBhbmQgY29tcGFyZXMgaXRzCisgKiBudW1lcmljIGlkIHdpdGggdGhlIHJlcXVlc3RlZCBjb21wcmVzc2lvbiB0eXBlLiBDb21wYXJpc29uIHJlc3VsdCBpcworICogcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEgaWYgaW1hZ2UgdXNlcyByZXF1ZXN0ZWQgY29tcHJlc3Npb24KKyAqICAgICAwIG90aGVyd2lzZSAob3Igb24gZXJyb3IpCisgKi8KK2ludCBmaXRfaW1hZ2VfY2hlY2tfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBjb21wKQoreworCXVpbnQ4X3QgaW1hZ2VfY29tcDsKKworCWlmIChmaXRfaW1hZ2VfZ2V0X2NvbXAgKGZpdCwgbm9mZnNldCwgJmltYWdlX2NvbXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKGNvbXAgPT0gaW1hZ2VfY29tcCk7Cit9CisKKy8qKgorICogZml0X2NoZWNrX2Zvcm1hdCAtIHNhbml0eSBjaGVjayBGSVQgaW1hZ2UgZm9ybWF0CisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIGZpdF9jaGVja19mb3JtYXQoKSBydW5zIGEgYmFzaWMgc2FuaXR5IEZJVCBpbWFnZSB2ZXJpZmljYXRpb24uCisgKiBSb3V0aW5lIGNoZWNrcyBmb3IgbWFuZGF0b3J5IHByb3BlcnRpZXMsIG5vZGVzLCBldGMuCisgKgorICogcmV0dXJuczoKKyAqICAgICAxLCBvbiBzdWNjZXNzCisgKiAgICAgMCwgb24gZmFpbHVyZQorICovCitpbnQgZml0X2NoZWNrX2Zvcm1hdCAoY29uc3Qgdm9pZCAqZml0KQoreworCS8qIG1hbmRhdG9yeSAvIG5vZGUgJ2Rlc2NyaXB0aW9uJyBwcm9wZXJ0eSAqLworCWlmIChmZHRfZ2V0cHJvcCAoZml0LCAwLCBGSVRfREVTQ19QUk9QLCBOVUxMKSA9PSBOVUxMKSB7CisJCWRlYnVnICgiV3JvbmcgRklUIGZvcm1hdDogbm8gZGVzY3JpcHRpb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19USU1FU1RBTVApIHx8IGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKSB8fCBkZWZpbmVkKFVTRV9IT1NUQ0MpCisJLyogbWFuZGF0b3J5IC8gbm9kZSAndGltZXN0YW1wJyBwcm9wZXJ0eSAqLworCWlmIChmZHRfZ2V0cHJvcCAoZml0LCAwLCBGSVRfVElNRVNUQU1QX1BST1AsIE5VTEwpID09IE5VTEwpIHsKKwkJZGVidWcgKCJXcm9uZyBGSVQgZm9ybWF0OiBubyB0aW1lc3RhbXBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCS8qIG1hbmRhdG9yeSBzdWJpbWFnZXMgcGFyZW50ICcvaW1hZ2VzJyBub2RlICovCisJaWYgKGZkdF9wYXRoX29mZnNldCAoZml0LCBGSVRfSU1BR0VTX1BBVEgpIDwgMCkgeworCQlkZWJ1ZyAoIldyb25nIEZJVCBmb3JtYXQ6IG5vIGltYWdlcyBwYXJlbnQgbm9kZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9ub2RlIC0gZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdW5pdCBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQGNvbmZfdW5hbWU6IGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUKKyAqCisgKiBmaXRfY29uZl9nZXRfbm9kZSgpIGZpbmRzIGEgY29uZmlndXJhdGlvbiAod2l0aGluZyB0aGUgJy9jb25maWd1cmF0aW9ucycKKyAqIHBhcmFudCBub2RlKSBvZiBhIHByb3ZpZGVkIHVuaXQgbmFtZS4gSWYgY29uZmlndXJhdGlvbiBpcyBmb3VuZCBpdHMgbm9kZSBvZmZzZXQKKyAqIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKgorICogV2hlbiBOVUxMIGlzIHByb3ZpZGVkIGluIHNlY29uZCBhcmd1bWVudCBmaXRfY29uZl9nZXRfbm9kZSgpIHdpbGwgc2VhcmNoCisgKiBmb3IgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm9kZSBpbnN0ZWFkLiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUKKyAqIGlzIHJldHJpdmVkIGZyb20gRklUX0RFRkFVTFRfUFJPUCBwcm9wZXJ0eSBvZiB0aGUgJy9jb25maWd1cmF0aW9ucycgbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQgd2hlbiBmb3VuZCAoPj0wKQorICogICAgIG5lZ2F0aXZlIG51bWJlciBvbiBmYWlsdXJlIChGRFRfRVJSXyogY29kZSkKKyAqLworaW50IGZpdF9jb25mX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmNvbmZfdW5hbWUpCit7CisJaW50IG5vZmZzZXQsIGNvbmZzX25vZmZzZXQ7CisJaW50IGxlbjsKKworCWNvbmZzX25vZmZzZXQgPSBmZHRfcGF0aF9vZmZzZXQgKGZpdCwgRklUX0NPTkZTX1BBVEgpOworCWlmIChjb25mc19ub2Zmc2V0IDwgMCkgeworCQlkZWJ1ZyAoIkNhbid0IGZpbmQgY29uZmlndXJhdGlvbnMgcGFyZW50IG5vZGUgJyVzJyAoJXMpXG4iLAorCQkJRklUX0NPTkZTX1BBVEgsIGZkdF9zdHJlcnJvciAoY29uZnNfbm9mZnNldCkpOworCQlyZXR1cm4gY29uZnNfbm9mZnNldDsKKwl9CisKKwlpZiAoY29uZl91bmFtZSA9PSBOVUxMKSB7CisJCS8qIGdldCBjb25maWd1cmF0aW9uIHVuaXQgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHByb3BlcnR5ICovCisJCWRlYnVnICgiTm8gY29uZmlndXJhdGlvbiBzcGVjaWZpZWQsIHRyeWluZyBkZWZhdWx0Li4uXG4iKTsKKwkJY29uZl91bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgY29uZnNfbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgJmxlbik7CisJCWlmIChjb25mX3VuYW1lID09IE5VTEwpIHsKKwkJCWZpdF9nZXRfZGVidWcgKGZpdCwgY29uZnNfbm9mZnNldCwgRklUX0RFRkFVTFRfUFJPUCwgbGVuKTsKKwkJCXJldHVybiBsZW47CisJCX0KKwkJZGVidWcgKCJGb3VuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb246ICclcydcbiIsIGNvbmZfdW5hbWUpOworCX0KKworCW5vZmZzZXQgPSBmZHRfc3Vibm9kZV9vZmZzZXQgKGZpdCwgY29uZnNfbm9mZnNldCwgY29uZl91bmFtZSk7CisJaWYgKG5vZmZzZXQgPCAwKSB7CisJCWRlYnVnICgiQ2FuJ3QgZ2V0IG5vZGUgb2Zmc2V0IGZvciBjb25maWd1cmF0aW9uIHVuaXQgbmFtZTogJyVzJyAoJXMpXG4iLAorCQkJY29uZl91bmFtZSwgZmR0X3N0cmVycm9yIChub2Zmc2V0KSk7CisJfQorCisJcmV0dXJuIG5vZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LAorCQljb25zdCBjaGFyICpwcm9wX25hbWUpCit7CisJY2hhciAqdW5hbWU7CisJaW50IGxlbjsKKworCS8qIGdldCBrZXJuZWwgaW1hZ2UgdW5pdCBuYW1lIGZyb20gY29uZmlndXJhdGlvbiBrZXJuZWwgcHJvcGVydHkgKi8KKwl1bmFtZSA9IChjaGFyICopZmR0X2dldHByb3AgKGZpdCwgbm9mZnNldCwgcHJvcF9uYW1lLCAmbGVuKTsKKwlpZiAodW5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIGxlbjsKKworCXJldHVybiBmaXRfaW1hZ2VfZ2V0X25vZGUgKGZpdCwgdW5hbWUpOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAtIGdldCBrZXJuZWwgaW1hZ2Ugbm9kZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICogYSBnaXZlbiBjb25maWd1cmF0aW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUoKSByZXRyaXZlcyBrZXJuZWwgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfa2VybmVsX25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpCit7CisJcmV0dXJuIF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoZml0LCBub2Zmc2V0LCBGSVRfS0VSTkVMX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUgLSBnZXQgcmFtZGlzayBpbWFnZSBub2RlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCisgKiBhIGdpdmVuIGNvbmZpZ3VyYXRpb24KKyAqIEBmaXQ6IHBvaW50ZXIgdG8gdGhlIEZJVCBmb3JtYXQgaW1hZ2UgaGVhZGVyCisgKiBAbm9mZnNldDogY29uZmlndXJhdGlvbiBub2RlIG9mZnNldAorICoKKyAqIGZpdF9jb25mX2dldF9yYW1kaXNrX25vZGUoKSByZXRyaXZlcyByYW1kaXNrIGltYWdlIG5vZGUgdW5pdCBuYW1lIGZyb20KKyAqIGNvbmZpZ3VyYXRpb24gRklUX0tFUk5FTF9QUk9QIHByb3BlcnR5IGFuZCB0cmFuc2xhdGVzIGl0IHRvIHRoZSBub2RlCisgKiBvZmZzZXQuCisgKgorICogcmV0dXJuczoKKyAqICAgICBpbWFnZSBub2RlIG9mZnNldCB3aGVuIGZvdW5kICg+PTApCisgKiAgICAgbmVnYXRpdmUgbnVtYmVyIG9uIGZhaWx1cmUgKEZEVF9FUlJfKiBjb2RlKQorICovCitpbnQgZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCkKK3sKKwlyZXR1cm4gX19maXRfY29uZl9nZXRfcHJvcF9ub2RlIChmaXQsIG5vZmZzZXQsIEZJVF9SQU1ESVNLX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX2dldF9mZHRfbm9kZSAtIGdldCBmZHQgaW1hZ2Ugbm9kZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bworICogYSBnaXZlbiBjb25maWd1cmF0aW9uCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICogQG5vZmZzZXQ6IGNvbmZpZ3VyYXRpb24gbm9kZSBvZmZzZXQKKyAqCisgKiBmaXRfY29uZl9nZXRfZmR0X25vZGUoKSByZXRyaXZlcyBmZHQgaW1hZ2Ugbm9kZSB1bml0IG5hbWUgZnJvbQorICogY29uZmlndXJhdGlvbiBGSVRfS0VSTkVMX1BST1AgcHJvcGVydHkgYW5kIHRyYW5zbGF0ZXMgaXQgdG8gdGhlIG5vZGUKKyAqIG9mZnNldC4KKyAqCisgKiByZXR1cm5zOgorICogICAgIGltYWdlIG5vZGUgb2Zmc2V0IHdoZW4gZm91bmQgKD49MCkKKyAqICAgICBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZSAoRkRUX0VSUl8qIGNvZGUpCisgKi8KK2ludCBmaXRfY29uZl9nZXRfZmR0X25vZGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpCit7CisJcmV0dXJuIF9fZml0X2NvbmZfZ2V0X3Byb3Bfbm9kZSAoZml0LCBub2Zmc2V0LCBGSVRfRkRUX1BST1ApOworfQorCisvKioKKyAqIGZpdF9jb25mX3ByaW50IC0gcHJpbnRzIG91dCB0aGUgRklUIGNvbmZpZ3VyYXRpb24gZGV0YWlscworICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqIEBub2Zmc2V0OiBvZmZzZXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gbm9kZQorICogQHA6IHBvaW50ZXIgdG8gcHJlZml4IHN0cmluZworICoKKyAqIGZpdF9jb25mX3ByaW50KCkgbGlzdHMgYWxsIG1hbmRhdG9yeSBwcm9wZXJpZXMgZm9yIHRoZSBwcm9jZXNzZWQKKyAqIGNvbmZpZ3VyYXRpb24gbm9kZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIG5vIHJldHVybmVkIHJlc3VsdHMKKyAqLwordm9pZCBmaXRfY29uZl9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCkKK3sKKwljaGFyICpkZXNjOworCWNoYXIgKnVuYW1lOworCWludCByZXQ7CisKKwkvKiBNYW5kYXRvcnkgcHJvcGVydGllcyAqLworCXJldCA9IGZpdF9nZXRfZGVzYyAoZml0LCBub2Zmc2V0LCAmZGVzYyk7CisJcHJpbnRmICgiJXMgIERlc2NyaXB0aW9uOiAgIiwgcCk7CisJaWYgKHJldCkKKwkJcHJpbnRmICgidW5hdmFpbGFibGVcbiIpOworCWVsc2UKKwkJcHJpbnRmICgiJXNcbiIsIGRlc2MpOworCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9LRVJORUxfUFJPUCwgTlVMTCk7CisJcHJpbnRmICgiJXMgIEtlcm5lbDogICAgICAgIiwgcCk7CisJaWYgKHVuYW1lID09IE5VTEwpCisJCXByaW50ZiAoInVuYXZhaWxhYmxlXG4iKTsKKwllbHNlCisJCXByaW50ZiAoIiVzXG4iLCB1bmFtZSk7CisKKwkvKiBPcHRpb25hbCBwcm9wZXJ0aWVzICovCisJdW5hbWUgPSAoY2hhciAqKWZkdF9nZXRwcm9wIChmaXQsIG5vZmZzZXQsIEZJVF9SQU1ESVNLX1BST1AsIE5VTEwpOworCWlmICh1bmFtZSkKKwkJcHJpbnRmICgiJXMgIEluaXQgUmFtZGlzazogJXNcbiIsIHAsIHVuYW1lKTsKKworCXVuYW1lID0gKGNoYXIgKilmZHRfZ2V0cHJvcCAoZml0LCBub2Zmc2V0LCBGSVRfRkRUX1BST1AsIE5VTEwpOworCWlmICh1bmFtZSkKKwkJcHJpbnRmICgiJXMgIEZEVDogICAgICAgICAgJXNcbiIsIHAsIHVuYW1lKTsKK30KKworLyoqCisgKiBmaXRfY2hlY2tfcmFtZGlzayAtIHZlcmlmeSBGSVQgZm9ybWF0IHJhbWRpc2sgc3ViaW1hZ2UKKyAqIEBmaXRfaGRyOiBwb2ludGVyIHRvIHRoZSBGSVQgcmFtZGlzayBoZWFkZXIKKyAqIEByZF9ub2Zmc2V0OiByYW1kaXNrIHN1YmltYWdlIG5vZGUgb2Zmc2V0IHdpdGhpbiBGSVQgaW1hZ2UKKyAqIEBhcmNoOiByZXF1ZXN0ZWQgcmFtZGlzayBpbWFnZSBhcmNoaXRlY3R1cmUgdHlwZQorICogQHZlcmlmeTogZGF0YSBDUkMgdmVyaWZpY2F0aW9uIGZsYWcKKyAqCisgKiBmaXRfY2hlY2tfcmFtZGlzaygpIHZlcmlmaWVzIGludGVncml0eSBvZiB0aGUgcmFtZGlzayBzdWJpbWFnZSBhbmQgZnJvbQorICogc3BlY2lmaWVkIEZJVCBpbWFnZS4KKyAqCisgKiByZXR1cm5zOgorICogICAgIDEsIG9uIHN1Y2Nlc3MKKyAqICAgICAwLCBvbiBmYWlsdXJlCisgKi8KKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGludCBmaXRfY2hlY2tfcmFtZGlzayAoY29uc3Qgdm9pZCAqZml0LCBpbnQgcmRfbm9mZnNldCwgdWludDhfdCBhcmNoLCBpbnQgdmVyaWZ5KQoreworCWZpdF9pbWFnZV9wcmludCAoZml0LCByZF9ub2Zmc2V0LCAiICAgIik7CisKKwlpZiAodmVyaWZ5KSB7CisJCXB1dHMgKCIgICBWZXJpZnlpbmcgSGFzaCBJbnRlZ3JpdHkgLi4uICIpOworCQlpZiAoIWZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGZpdCwgcmRfbm9mZnNldCkpIHsKKwkJCXB1dHMgKCJCYWQgRGF0YSBIYXNoXG4iKTsKKwkJCXNob3dfYm9vdF9wcm9ncmVzcyAoLTEyNSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwdXRzICgiT0tcbiIpOworCX0KKworCXNob3dfYm9vdF9wcm9ncmVzcyAoMTI2KTsKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19vcyAoZml0LCByZF9ub2Zmc2V0LCBJSF9PU19MSU5VWCkgfHwKKwkgICAgIWZpdF9pbWFnZV9jaGVja19hcmNoIChmaXQsIHJkX25vZmZzZXQsIGFyY2gpIHx8CisJICAgICFmaXRfaW1hZ2VfY2hlY2tfdHlwZSAoZml0LCByZF9ub2Zmc2V0LCBJSF9UWVBFX1JBTURJU0spKSB7CisJCXByaW50ZiAoIk5vIExpbnV4ICVzIFJhbWRpc2sgSW1hZ2VcbiIsCisJCQkJZ2VuaW1nX2dldF9hcmNoX25hbWUoYXJjaCkpOworCQlzaG93X2Jvb3RfcHJvZ3Jlc3MgKC0xMjYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzaG93X2Jvb3RfcHJvZ3Jlc3MgKDEyNyk7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworI2VuZGlmIC8qIENPTkZJR19GSVQgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NvbW1vbi9tYWluLmMgYi94LWxvYWRlci9jb21tb24vbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTc4OGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb21tb24vbWFpbi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogQWRkIHRvIHJlYWRsaW5lIGNtZGxpbmUtZWRpdGluZyBieQorICogKEMpIENvcHlyaWdodCAyMDA1CisgKiBKaW5IdWEgTHVvLCBHdWFuZ0RvbmcgTGludXggQ2VudGVyLCA8bHVvLmppbmh1YUBnZC1saW51eC5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyogI2RlZmluZQlERUJVRwkqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc2hvd19ib290X3Byb2dyZXNzICgpIGlmIG5lZWRlZAorICovCit2b2lkIGlubGluZSBfX3Nob3dfYm9vdF9wcm9ncmVzcyAoaW50IHZhbCkge30KK3ZvaWQgc2hvd19ib290X3Byb2dyZXNzIChpbnQgdmFsKSBfX2F0dHJpYnV0ZV9fKCh3ZWFrLCBhbGlhcygiX19zaG93X2Jvb3RfcHJvZ3Jlc3MiKSkpOwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY29uZmlnLm1rIGIveC1sb2FkZXIvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODBjNjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jb25maWcubWsKQEAgLTAsMCArMSwyNTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQoraWZlcSAoJChDVVJESVIpLCQoU1JDVFJFRSkpCitkaXIgOj0KK2Vsc2UKK2RpciA6PSAkKHN1YnN0ICQoU1JDVFJFRSkvLCwkKENVUkRJUikpCitlbmRpZgorCitvYmogOj0gJChpZiAkKGRpciksJChPQkpUUkVFKS8kKGRpcikvLCQoT0JKVFJFRSkvKQorc3JjIDo9ICQoaWYgJChkaXIpLCQoU1JDVFJFRSkvJChkaXIpLywkKFNSQ1RSRUUpLykKKworJChzaGVsbCBta2RpciAtcCAkKG9iaikpCitlbHNlCitvYmogOj0KK3NyYyA6PQorZW5kaWYKKworIyBjbGVhbiB0aGUgc2xhdGUgLi4uCitQTEFURk9STV9SRUxGTEFHUyA9CitQTEFURk9STV9DUFBGTEFHUyA9CitQTEFURk9STV9MREZMQUdTID0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitIT1NUQ0ZMQUdTCT0gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzIgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorCQkgICQoSE9TVENQUEZMQUdTKQorSE9TVFNUUklQCT0gc3RyaXAKKworIworIyBNYWMgT1MgWCAvIERhcndpbidzIEMgcHJlcHJvY2Vzc29yIGlzIEFwcGxlIHNwZWNpZmljLiAgSXQKKyMgZ2VuZXJhdGVzIG51bWVyb3VzIGVycm9ycyBhbmQgd2FybmluZ3MuICBXZSB3YW50IHRvIGJ5cGFzcyBpdAorIyBhbmQgdXNlIEdOVSBDJ3MgY3BwLiAgVG8gZG8gdGhpcyB3ZSBwYXNzIHRoZSAtdHJhZGl0aW9uYWwtY3BwCisjIG9wdGlvbiB0byB0aGUgY29tcGlsZXIuICBOb3RlIHRoYXQgdGhlIC10cmFkaXRpb25hbC1jcHAgZmxhZworIyBET0VTIE5PVCBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBHTlUgQydzIGZsYWcsIGFsbCBpdCBkb2VzCisjIGlzIGludm9rZSB0aGUgR05VIHByZXByb2Nlc3NvciBpbiBzdG9jayBBTlNJL0lTTyBDIGZhc2hpb24uCisjCisjIEFwcGxlJ3MgbGlua2VyIGlzIHNpbWlsYXIsIHRoYW5rcyB0byB0aGUgbmV3IDIgc3RhZ2UgbGlua2luZworIyBtdWx0aXBsZSBzeW1ib2wgZGVmaW5pdGlvbnMgYXJlIHRyZWF0ZWQgYXMgZXJyb3JzLCBoZW5jZSB0aGUKKyMgLW11bHRpcGx5X2RlZmluZWQgc3VwcHJlc3Mgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoaXMgZXJyb3IuCisjCisKK2lmZXEgKCQoSE9TVE9TKSxkYXJ3aW4pCisjIGdldCBtYWpvciBhbmQgbWlub3IgcHJvZHVjdCB2ZXJzaW9uIChlLmcuICcxMCcgYW5kICc2JyBmb3IgU25vdyBMZW9wYXJkKQorREFSV0lOX01BSk9SX1ZFUlNJT04JPSAkKHNoZWxsIHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uIHwgY3V0IC1mIDEgLWQgJy4nKQorREFSV0lOX01JTk9SX1ZFUlNJT04JPSAkKHNoZWxsIHN3X3ZlcnMgLXByb2R1Y3RWZXJzaW9uIHwgY3V0IC1mIDIgLWQgJy4nKQorCitvc194X2JlZm9yZQk9ICQoc2hlbGwgaWYgWyAkKERBUldJTl9NQUpPUl9WRVJTSU9OKSAtbGUgJCgxKSAtYSBcCisJJChEQVJXSU5fTUlOT1JfVkVSU0lPTikgLWxlICQoMikgXSA7IHRoZW4gZWNobyAiJCgzKSI7IGVsc2UgZWNobyAiJCg0KSI7IGZpIDspCisKKyMgU25vdyBMZW9wYXJkcyBidWlsZCBlbnZpcm9ubWVudCBoYXMgbm8gbG9uZ2VyIHJlc3RyaWN0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUKK0hPU1RDQwkJID0gJChjYWxsIG9zX3hfYmVmb3JlLCAxMCwgNSwgImNjIiwgImdjYyIpCitIT1NUQ0ZMQUdTCSs9ICQoY2FsbCBvc194X2JlZm9yZSwgMTAsIDQsICItdHJhZGl0aW9uYWwtY3BwIikKK0hPU1RMREZMQUdTCSs9ICQoY2FsbCBvc194X2JlZm9yZSwgMTAsIDUsICItbXVsdGlwbHlfZGVmaW5lZCBzdXBwcmVzcyIpCitlbHNlCitIT1NUQ0MJCT0gZ2NjCitlbmRpZgorCitpZmVxICgkKEhPU1RPUyksY3lnd2luKQorSE9TVENGTEFHUwkrPSAtYW5zaQorZW5kaWYKKworIyBXZSBidWlsZCBzb21lIGZpbGVzIHdpdGggZXh0cmEgcGVkYW50aWMgZmxhZ3MgdG8gdHJ5IHRvIG1pbmltaXplIHRoaW5ncworIyB0aGF0IHdvbid0IGJ1aWxkIG9uIHNvbWUgd2VpcmQgaG9zdCBjb21waWxlciAtLSB0aG91Z2ggdGhlcmUgYXJlIGxvdHMgb2YKKyMgZXhjZXB0aW9ucyBmb3IgZmlsZXMgdGhhdCBhcmVuJ3QgY29tcGxhaW50LgorCitIT1NUQ0ZMQUdTX05PUEVEID0gJChmaWx0ZXItb3V0IC1wZWRhbnRpYywkKEhPU1RDRkxBR1MpKQorSE9TVENGTEFHUwkrPSAtcGVkYW50aWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBPcHRpb24gY2hlY2tlciAoY291cnRlc3kgbGludXgga2VybmVsKSB0byBlbnN1cmUKKyMgb25seSBzdXBwb3J0ZWQgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZAorIworY2Mtb3B0aW9uID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCBcCisJCT4gL2Rldi9udWxsIDI+JjE7IHRoZW4gZWNobyAiJCgxKSI7IGVsc2UgZWNobyAiJCgyKSI7IGZpIDspCisKKyMKKyMgSW5jbHVkZSB0aGUgbWFrZSB2YXJpYWJsZXMgKENDLCBldGMuLi4pCisjCitBUwk9ICQoQ1JPU1NfQ09NUElMRSlhcworTEQJPSAkKENST1NTX0NPTVBJTEUpbGQKK0NDCT0gJChDUk9TU19DT01QSUxFKWdjYworQ1BQCT0gJChDQykgLUUKK0FSCT0gJChDUk9TU19DT01QSUxFKWFyCitOTQk9ICQoQ1JPU1NfQ09NUElMRSlubQorU1RSSVAJPSAkKENST1NTX0NPTVBJTEUpc3RyaXAKK09CSkNPUFkgPSAkKENST1NTX0NPTVBJTEUpb2JqY29weQorT0JKRFVNUCA9ICQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wCitSQU5MSUIJPSAkKENST1NTX0NPTVBJTEUpUkFOTElCCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBMb2FkIGdlbmVyYXRlZCBib2FyZCBjb25maWd1cmF0aW9uCitzaW5jbHVkZSAkKE9CSlRSRUUpL2luY2x1ZGUvYXV0b2NvbmYubWsKKworIyBTb21lIGFyY2hpdGVjdHVyZSBjb25maWcubWsgZmlsZXMgbmVlZCB0byBrbm93IHdoYXQgQ1BVRElSIGlzIHNldCB0bywKKyMgc28gY2FsY3VsYXRlIENQVURJUiBiZWZvcmUgaW5jbHVkaW5nIEFSQ0gvU09DL0NQVSBjb25maWcubWsgZmlsZXMuCisjIENoZWNrIGlmIGFyY2gvJEFSQ0gvY3B1LyRDUFUgZXhpc3RzLCBvdGhlcndpc2UgYXNzdW1lIGFyY2gvJEFSQ0gvY3B1IGNvbnRhaW5zCisjIENQVS1zcGVjaWZpYyBjb2RlLgorQ1BVRElSPWNwdS8kKENQVSkKK2lmbmVxICgkKFNSQ1RSRUUpLyQoQ1BVRElSKSwkKHdpbGRjYXJkICQoU1JDVFJFRSkvJChDUFVESVIpKSkKK0NQVURJUj1jcHUKK2VuZGlmCisKK3NpbmNsdWRlICQoVE9QRElSKS8kKEFSQ0gpX2NvbmZpZy5tawkJIyBpbmNsdWRlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbmQgcnVsZXMKK3NpbmNsdWRlICQoVE9QRElSKS8kKENQVURJUikvY29uZmlnLm1rCQkjIGluY2x1ZGUgIENQVQlzcGVjaWZpYyBydWxlcworCitpZmRlZglTT0MKK3NpbmNsdWRlICQoVE9QRElSKS8kKENQVURJUikvJChTT0MpL2NvbmZpZy5tawkjIGluY2x1ZGUgIFNvQwlzcGVjaWZpYyBydWxlcworZW5kaWYKK2lmZGVmCVZFTkRPUgorQk9BUkRESVIgPSAkKFZFTkRPUikvJChCT0FSRCkKK2Vsc2UKK0JPQVJERElSID0gJChCT0FSRCkKK2VuZGlmCitpZmRlZglCT0FSRAorc2luY2x1ZGUgJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL2NvbmZpZy5tawkjIGluY2x1ZGUgYm9hcmQgc3BlY2lmaWMgcnVsZXMKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZuZXEgKCwkKGZpbmRzdHJpbmcgcywkKE1BS0VGTEFHUykpKQorQVJGTEFHUyA9IGNyCitlbHNlCitBUkZMQUdTID0gY3J2CitlbmRpZgorUkVMRkxBR1M9ICQoUExBVEZPUk1fUkVMRkxBR1MpCitEQkdGTEFHUz0gLWcgIyAtRERFQlVHCitPUFRGTEFHUz0gLU9zICMtZm9taXQtZnJhbWUtcG9pbnRlcgoraWZuZGVmIExEU0NSSVBUCisjTERTQ1JJUFQgOj0gJChUT1BESVIpL2JvYXJkLyQoQk9BUkRESVIpL3gtbG9hZC5sZHMuZGVidWcKK0xEU0NSSVBUIDo9ICQoVE9QRElSKS9ib2FyZC8kKEJPQVJERElSKS94LWxvYWQubGRzCitlbmRpZgorT0JKQ0ZMQUdTICs9IC0tZ2FwLWZpbGw9MHhmZgorCitnY2NpbmNkaXIgOj0gJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCisKK0NQUEZMQUdTIDo9ICQoREJHRkxBR1MpICQoT1BURkxBR1MpICQoUkVMRkxBR1MpCQlcCisJLURfX0tFUk5FTF9fCitpZm5lcSAoJChURVhUX0JBU0UpLCkKK0NQUEZMQUdTICs9IC1EVEVYVF9CQVNFPSQoVEVYVF9CQVNFKQorZW5kaWYKKworaWZuZXEgKCQoU1RBQ0tfQkFTRSksKQorQ1BQRkxBR1MgKz0gLURTVEFDS19CQVNFPSQoU1RBQ0tfQkFTRSkKK2VuZGlmCisKK2lmbmVxICgkKFJFU0VUX1ZFQ1RPUl9BRERSRVNTKSwpCitDUFBGTEFHUyArPSAtRFJFU0VUX1ZFQ1RPUl9BRERSRVNTPSQoUkVTRVRfVkVDVE9SX0FERFJFU1MpCitlbmRpZgorCitpZm5lcSAoJChPQkpUUkVFKSwkKFNSQ1RSRUUpKQorQ1BQRkxBR1MgKz0gLUkkKE9CSlRSRUUpL2luY2x1ZGUyIC1JJChPQkpUUkVFKS9pbmNsdWRlCitlbmRpZgorCitDUFBGTEFHUyArPSAtSSQoVE9QRElSKS9pbmNsdWRlCitDUFBGTEFHUyArPSAtZm5vLWJ1aWx0aW4gLWZmcmVlc3RhbmRpbmcgLW5vc3RkaW5jCVwKKwktaXN5c3RlbSAkKGdjY2luY2RpcikgLXBpcGUgJChQTEFURk9STV9DUFBGTEFHUykKKworaWZkZWYgQlVJTERfVEFHCitDRkxBR1MgOj0gJChDUFBGTEFHUykgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyBcCisJLURCVUlMRF9UQUc9JyIkKEJVSUxEX1RBRykiJworZWxzZQorQ0ZMQUdTIDo9ICQoQ1BQRkxBR1MpIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMKK2VuZGlmCisKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tc3RhY2stcHJvdGVjdG9yKQorCisjICQoQ1BQRkxBR1MpIHNldHMgLWcsIHdoaWNoIGNhdXNlcyBnY2MgdG8gcGFzcyBhIHN1aXRhYmxlIC1nPGZvcm1hdD4KKyMgb3B0aW9uIHRvIHRoZSBhc3NlbWJsZXIuCitBRkxBR1NfREVCVUcgOj0KKworQUZMQUdTX0RFQlVHIDo9IC1XYSwtZ3N0YWJzCitBRkxBR1MgOj0gJChBRkxBR1NfREVCVUcpIC1EX19BU1NFTUJMWV9fICQoQ1BQRkxBR1MpCisKK0xERkxBR1MgKz0gLUJzdGF0aWMgLVQgJChvYmopeC1sb2FkLmxkcyAkKFBMQVRGT1JNX0xERkxBR1MpCitpZm5lcSAoJChURVhUX0JBU0UpLCkKK0xERkxBR1MgKz0gLVR0ZXh0ICQoVEVYVF9CQVNFKQorZW5kaWYKKworIyBMb2NhdGlvbiBvZiBhIHVzYWJsZSBCRkQgbGlicmFyeSwgd2hlcmUgd2UgZGVmaW5lICJ1c2FibGUiIGFzCisjICJidWlsdCBmb3IgJHtIT1NUfSwgc3VwcG9ydHMgJHtUQVJHRVR9Ii4gIFNlbnNpYmxlIHZhbHVlcyBhcmUKKyMgLSBXaGVuIGNyb3NzLWNvbXBpbGluZzogdGhlIHJvb3Qgb2YgdGhlIGNyb3NzLWVudmlyb25tZW50CisjIC0gTGludXgvcHBjIChuYXRpdmUpOiAvdXNyCisjIC0gTmV0QlNEL3BwYyAobmF0aXZlKTogeW91IGxvc2UgLi4uIChtdXN0IGV4dHJhY3QgdGhlc2UgZnJvbSB0aGUKKyMgICBiaW51dGlscyBidWlsZCBkaXJlY3RvcnksIHBsdXMgdGhlIG5hdGl2ZSBhbmQgVS1Cb290IGluY2x1ZGUKKyMgICBmaWxlcyBkb24ndCBsaWtlIGVhY2ggb3RoZXIpCisjCisjIFNvIGZhciwgdGhpcyBpcyB1c2VkIG9ubHkgYnkgdG9vbHMvZ2RiL01ha2VmaWxlLgorCitpZmVxICgkKEhPU1RPUyksZGFyd2luKQorQkZEX1JPT1RfRElSID0JCS91c3IvbG9jYWwvdG9vbHMKK2Vsc2UKK2lmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCisjIG5hdGl2ZQorQkZEX1JPT1RfRElSID0JCS91c3IKK2Vsc2UKKyNCRkRfUk9PVF9ESVIgPQkJL0xpbnV4UFBDL0NESwkJIyBMaW51eC9pMzg2CisjQkZEX1JPT1RfRElSID0JCS91c3IvcGtnL2Nyb3NzCQkjIE5ldEJTRC9pMzg2CitCRkRfUk9PVF9ESVIgPQkJL29wdC9wb3dlcnBjCitlbmRpZgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitleHBvcnQJSE9TVENDIEhPU1RDRkxBR1MgSE9TVExERkxBR1MgUEVEQ0ZMQUdTIEhPU1RTVFJJUCBDUk9TU19DT01QSUxFIFwKKwlBUyBMRCBDQyBDUFAgQVIgTk0gU1RSSVAgT0JKQ09QWSBPQkpEVU1QIE1BS0UKK2V4cG9ydAlURVhUX0JBU0UgUExBVEZPUk1fQ1BQRkxBR1MgUExBVEZPUk1fUkVMRkxBR1MgQ1BQRkxBR1MgQ0ZMQUdTIEFGTEFHUworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQWxsb3cgYm9hcmRzIHRvIHVzZSBjdXN0b20gb3B0aW1pemUgZmxhZ3Mgb24gYSBwZXIgZGlyL2ZpbGUgYmFzaXMKK0JDVVJESVIgPSAkKHN1YnN0ICQoU1JDVFJFRSkvLCwkKENVUkRJUjokKG9iaiklPSUpKQorJChvYmopJS5zOgklLlMKKwkkKENQUCkgJChBRkxBR1MpICQoQUZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQUZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwKKyQob2JqKSUubzoJJS5TCisJJChDQykgICQoQUZMQUdTKSAkKEFGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKEFGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jCiskKG9iaiklLm86CSUuYworCSQoQ0MpICAkKENGTEFHUykgJChDRkxBR1NfJChCQ1VSRElSKS8kKEBGKSkgJChDRkxBR1NfJChCQ1VSRElSKSkgXAorCQktbyAkQCAkPCAtYworJChvYmopJS5pOgklLmMKKwkkKENQUCkgJChDRkxBR1MpICQoQ0ZMQUdTXyQoQkNVUkRJUikvJChARikpICQoQ0ZMQUdTXyQoQkNVUkRJUikpIFwKKwkJLW8gJEAgJDwgLWMKKyQob2JqKSUuczoJJS5jCisJJChDQykgICQoQ0ZMQUdTKSAkKENGTEFHU18kKEJDVVJESVIpLyQoQEYpKSAkKENGTEFHU18kKEJDVVJESVIpKSBcCisJCS1vICRAICQ8IC1jIC1TCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9hcm0xMTM2L01ha2VmaWxlIGIveC1sb2FkZXIvY3B1L2FybTExMzYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJhMzRhYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworT0JKUwk9IGNwdS5vCisKK2FsbDoJJChvYmopLmRlcGVuZCAkKFNUQVJUKSAkKExJQikKKworJChMSUIpOgkkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9jb25maWcubWsgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNjgyNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm0xMTM2L2NvbmZpZy5tawpAQCAtMCwwICsxLDMzIEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMgorIyBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCitQTEFURk9STV9SRUxGTEFHUyArPSAtZm5vLXN0cmljdC1hbGlhc2luZyAgLWZuby1jb21tb24gLWZmaXhlZC1yOAorCitQTEFURk9STV9DUFBGTEFHUyArPSAtbWFyY2g9YXJtdjUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdXBwbHkgb3B0aW9ucyBhY2NvcmRpbmcgdG8gY29tcGlsZXIgdmVyc2lvbgorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQTEFURk9STV9DUFBGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQorIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTExMzYvY3B1LmMgYi94LWxvYWRlci9jcHUvYXJtMTEzNi9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY4ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvY3B1LmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0dXJtZW50cworICoKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogdWRlbGF5KCkgaXMgQ1BVIHNwZWNpZmljIGNvZGUKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKy8qIFNlZSBhbHNvIEFSTSBSZWYuIE1hbi4gKi8KKyNkZWZpbmUgQzFfTU1VCQkoMTw8MCkJCS8qIG1tdSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfQUxJR04JKDE8PDEpCQkvKiBhbGlnbm1lbnQgZmF1bHRzIG9mZi9vbiAqLworI2RlZmluZSBDMV9EQwkJKDE8PDIpCQkvKiBkY2FjaGUgb2ZmL29uICovCisjZGVmaW5lIEMxX1dCCQkoMTw8MykJCS8qIG1lcmdpbmcgd3JpdGUgYnVmZmVyIG9uL29mZiAqLworI2RlZmluZSBDMV9CSUdfRU5ESUFOCSgxPDw3KQkvKiBiaWcgZW5kaWFuIG9mZi9vbiAqLworI2RlZmluZSBDMV9TWVNfUFJPVAkoMTw8OCkJCS8qIHN5c3RlbSBwcm90ZWN0aW9uICovCisjZGVmaW5lIEMxX1JPTV9QUk9UCSgxPDw5KQkJLyogUk9NIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfSUMJCSgxPDwxMikJCS8qIGljYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfSElHSF9WRUNUT1JTCSgxPDwxMykJLyogbG9jYXRpb24gb2YgdmVjdG9yczogbG93L2hpZ2ggYWRkcmVzc2VzICovCisjZGVmaW5lIFJFU0VSVkVEXzEJKDB4ZiA8PCAzKQkvKiBtdXN0IGJlIDExMWIgZm9yIFIvVyAqLworCitpbnQgY3B1X2luaXQgKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiB0dXJuIG9mZiBJL0QtY2FjaGUgKi8KKwlhc20gKCJtcmMgcDE1LCAwLCAlMCwgYzEsIGMwLCAwIjoiPXIiIChpKSk7CisJaSAmPSB+KEMxX0RDIHwgQzFfSUMpOworCWFzbSAoIm1jciBwMTUsIDAsICUwLCBjMSwgYzAsIDAiOiA6InIiIChpKSk7CisKKwkvKiBmbHVzaCBJL0QtY2FjaGUgKi8KKwlpID0gMDsKKwlhc20gKCJtY3IgcDE1LCAwLCAlMCwgYzcsIGM3LCAwIjogOiJyIiAoaSkpOyAgLy8gaW52YWxpZGF0ZSBib3RoIGNhY2hlcyBhbmQgZmx1c2ggYnRiCisJYXNtICgibWNyIHAxNSwgMCwgJTAsIGM3LCBjMTAsIDQiOiA6InIiIChpKSk7IC8vIG1lbSBiYXJyaWVyIHRvIHN5bmMgdGhpbmdzCisKKwlyZXR1cm4gMDsKK30KKworCisKKworCisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvYXJtMTEzNi9zdGFydC5TIGIveC1sb2FkZXIvY3B1L2FybTExMzYvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEwOGQwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTExMzYvc3RhcnQuUwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqICBhcm1ib290IC0gU3RhcnR1cCBDb2RlIGZvciBPTVAyNDIwL0FSTTExMzYgQ1BVLWNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0ICBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDEJTWFyaXVzIEdy9mdlciA8bWFnQHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUdhcnkgSmVubmVqb2huIDxnakBkZW54LmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMwlSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCUtzaGl0aWogPGtzaGl0aWpAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwNAlKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworLmdsb2JsIF9zdGFydAorX3N0YXJ0OgkKKwliCXJlc2V0CisgCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKworX2hhbmc6CisgCS53b3JkIGRvX2hhbmcKKwkKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4IC8qIG5vdyAxNio0PTY0ICovCisKKy5nbG9iYWwgX2VuZF92ZWN0CitfZW5kX3ZlY3Q6CisKKwkuYmFsaWdubCAxNiwweGRlYWRiZWVmCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKKyAqCisgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20gbWVtb3J5IQorICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisgKiByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQorICogc2V0dXAgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDogCisJLyoKKwkgKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCisJICovCisJbXJzCXIwLGNwc3IKKwliaWMJcjAscjAsIzB4MWYKKwlvcnIJcjAscjAsIzB4ZDMKKwltc3IJY3BzcixyMAorCisJLyogQ29weSB2ZWN0b3JzIHRvIG1hc2sgUk9NIGluZGlyZWN0IGFkZHIgKi8gCisJYWRyICAgICByMCwgX3N0YXJ0ICAgICAgICAgICAgICAvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWFkZCAgICAgcjAsIHIwLCAjNAkJCQkvKiBza2lwIHJlc2V0IHZlY3RvcgkJCSovCisJbW92ICAgICByMiwgIzY0ICAgICAgICAgICAgICAgICAvKiByMiA8LSBzaXplIHRvIGNvcHkgICovCisJYWRkICAgICByMiwgcjAsIHIyICAgICAgICAgICAgICAvKiByMiA8LSBzb3VyY2UgZW5kIGFkZHJlc3MgICAgICAgICAqLworCW1vdiAgICAgcjEsICMweDQwMDAwMDAwICAgICAgICAgLyogYnVpbGQgdmVjdCBhZGRyICovCisJbW92ICAgICByMywgIzB4MDAyMDAwMDAKKwlhZGQgICAgIHIxLCByMSwgcjMKKwltb3YgICAgIHIzLCAjMHhmODAwCisJYWRkICAgICByMSwgcjEsIHIzCituZXh0OgorCWxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJuZSAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bnRpbCBlcXVhbCAqLworCisJYmwJY3B5X2Nsa19jb2RlICAgICAgICAgICAgLyogcHV0IGRwbGwgYWRqdXN0IGNvZGUgYmVoaW5kIHZlY3RvcnMgKi8KKyAKKwkvKiB0aGUgbWFzayBST00gY29kZSBzaG91bGQgaGF2ZSBQTEwgYW5kIG90aGVycyBzdGFibGUgKi8KKwlibCAgY3B1X2luaXRfY3JpdAorCityZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgVS1Cb290IHRvIFJBTQkgICAgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovCisJLyogYmVxIHN0YWNrX3NldHVwICovCisKKwlsZHIJcjIsIF9hcm1ib290X3N0YXJ0CisJbGRyCXIzLCBfYnNzX3N0YXJ0CisJc3ViCXIyLCByMywgcjIJCS8qIHIyIDwtIHNpemUgb2YgYXJtYm9vdCAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisKK2NvcHlfbG9vcDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVlZSBbcjJdICAgICovCisJYmxlCWNvcHlfbG9vcAorCisJLyogU2V0IHVwIHRoZSBzdGFjawkJCQkJCSAgICAqLworc3RhY2tfc2V0dXA6CisJbGRyCXIwLCBfVEVYVF9CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLworCXN1YglzcCwgcjAsICMxMjgJCS8qIGxlYXZlIDMyIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICAqLworCitjbGVhcl9ic3M6CisJbGRyCXIwLCBfYnNzX3N0YXJ0CQkvKiBmaW5kIHN0YXJ0IG9mIGJzcyBzZWdtZW50ICAgICAgICAqLworCWxkcglyMSwgX2Jzc19lbmQJCS8qIHN0b3AgaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisJbW92IAlyMiwgIzB4MDAwMDAwMDAJCS8qIGNsZWFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKy8vY2xic3NfbDpzdHIJcjIsIFtyMF0JCS8qIGNsZWFyIGxvb3AuLi4gICAgICAgICAgICAgICAgICAgICovCisvLwlhZGQJcjAsIHIwLCAjNAorLy8JY21wCXIwLCByMQorLy8JYm5lCWNsYnNzX2wKKworCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKKworX3N0YXJ0X2FybWJvb3Q6CS53b3JkIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworY3B1X2luaXRfY3JpdDoKKwkvKgorCSAqIGZsdXNoIHY0IEkvRCBjYWNoZXMKKwkgKi8KKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjNywgMAkvKiBmbHVzaCB2My92NCBjYWNoZSAqLworCW1jcglwMTUsIDAsIHIwLCBjOCwgYzcsIDAJLyogZmx1c2ggdjQgVExCICovCisKKwkvKgorCSAqIGRpc2FibGUgTU1VIHN0dWZmIGFuZCBjYWNoZXMKKwkgKi8KKwltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJQCBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykKKwliaWMJcjAsIHIwLCAjMHgwMDAwMDA4NwlAIGNsZWFyIGJpdHMgNywgMjowIChCLS0tIC1DQU0pCisJb3JyCXIwLCByMCwgIzB4MDAwMDAwMDIJQCBzZXQgYml0IDIgKEEpIEFsaWduCisjaWZuZGVmIENPTkZJR19JQ0FDSEVfT0ZGCisJb3JyCXIwLCByMCwgIzB4MDAwMDEwMDAJQCBzZXQgYml0IDEyIChJKSBJLUNhY2hlCisjZW5kaWYKKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisKKwkvKgorICAgICAgICAgKiBKdW1wIHRvIGJvYXJkIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLi4uIFRoZSBNYXNrIFJPTSB3aWxsIGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAgICAgKiBiYXNpYyBtZW1vcnkuICBHbyBoZXJlIHRvIGJ1bXAgdXAgY2xvY2sgcmF0ZSBhbmQgaGFuZGxlIHdha2UgdXAgY29uZGl0aW9ucy4KKwkgKi8KKwlhZHIJcjAsIF9zdGFydAkJLyogcjAgPC0gY3VycmVudCBwb3NpdGlvbiBvZiBjb2RlICAgKi8KKwlsZHIJcjEsIF9URVhUX0JBU0UJCS8qIHRlc3QgaWYgd2UgcnVuIGZyb20gZmxhc2ggb3IgUkFNICovCisJY21wICAgICByMCwgcjEgICAgICAgICAgICAgICAgICAvKiBwYXNzIG9uIGluZm8gYWJvdXQgc2tpcHBpbmcgc29tZSBpbml0IHBvcnRpb25zICovCisJbW92ZXEgICByMCwjMHgxICAgICAgICAgICAgICAgICAvKiBmbGFnIHRvIHNraXAgcHJjbSBhbmQgc2RyYyBzZXR1cCAqLworCW1vdm5lICAgcjAsIzB4MAorCisvL21vdiByMCwgIzEgICAgLyogdGhpcyBza2lwIG1lbW9yeSBpbml0ICovCisKKwltb3YJaXAsIGxyICAgICAgICAgIC8qIHBlcnNldmVyZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsCXBsYXRmb3Jtc2V0dXAgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworCisJbW92CWxyLCBpcCAgICAgICAgICAvKiByZXN0b3JlIGxpbmsgKi8KKwltb3YJcGMsIGxyICAgICAgICAgIC8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisKKworLyoKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyAJLmFsaWduICA1Citkb19oYW5nOgorCWxkcglzcCwgX1RFWFRfQkFTRQkJLyogdXNlIDMyIHdvcmRzIGFib3J0IHN0YWNrICovCisgICAJYmwJaGFuZwkJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9NYWtlZmlsZSBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgzYzNkMAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvTWFrZWZpbGUKQEAgLTAsMCArMSw0MyBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAtMjAwMworIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCT0gJChvYmopbGliJChDUFUpLmEKKworU1RBUlQJPSBzdGFydC5vCitPQkpTCT0gY3B1Lm8gIAorCithbGw6CSQob2JqKS5kZXBlbmQgJChTVEFSVCkgJChMSUIpCisKKyQoTElCKToJJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgZGVmaW5lcyAkKG9iaikuZGVwZW5kIHRhcmdldAoraW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jb25maWcubWsgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL2NvbmZpZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWFkYjEwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jb25maWcubWsKQEAgLTAsMCArMSwzMiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDIKKyMgR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1mbm8tY29tbW9uIC1mZml4ZWQtcjgKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLW1hcmNoPWFybXY1CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU3VwcGx5IG9wdGlvbnMgYWNjb3JkaW5nIHRvIGNvbXBpbGVyIHZlcnNpb24KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tYXBjcy0zMiwtbWFiaT1hcGNzLWdudSkKK1BMQVRGT1JNX1JFTEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKQorIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9jcHUuYyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyZmE4YQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9hcm05MjZlanMvY3B1LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzIDx3d3cudGkuY29tPgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogR2FyeSBKZW5uZWpvaG4sIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIDxnakBkZW54LmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyAgCisjZGVmaW5lIFRJTUVSX0xPQURfVkFMIDB4ZmZmZmZmZmYKKworLyogbWFjcm8gdG8gcmVhZCB0aGUgMzIgYml0IHRpbWVyICovCisjZGVmaW5lIFJFQURfVElNRVIgKCoodm9sYXRpbGUgdWxvbmcgKikoQ0ZHX1RJTUVSQkFTRSs4KSkKKworc3RhdGljIHVsb25nIHRpbWVzdGFtcDsKK3N0YXRpYyB1bG9uZyBsYXN0ZGVjOworCitzdGF0aWMgdm9pZCByZXNldF90aW1lcl9tYXNrZWQgKHZvaWQpOworCisvKiBub3RoaW5nIHJlYWxseSB0byBkbyB3aXRoIGNwdSwganVzdCBzdGFydHMgdXAgYSBjb3VudGVyLiAqLworaW50IGNwdV9pbml0ICh2b2lkKQoreworIAlpbnQzMl90IHZhbDsKKworCS8qIFN0YXJ0IHRoZSBkZWNyZW1lbnRlciB0aWNraW5nIGRvd24gZnJvbSAweGZmZmZmZmZmICovCisJKigoaW50MzJfdCAqKSAoQ0ZHX1RJTUVSQkFTRSArIExPQURfVElNKSkgPSBUSU1FUl9MT0FEX1ZBTDsKKwl2YWwgPSBNUFVUSU1fU1QgfCBNUFVUSU1fQVIgfCBNUFVUSU1fQ0xPQ0tfRU5BQkxFIHwgKENGR19QVlQgPDwgTVBVVElNX1BUVl9CSVQpOworCSooKGludDMyX3QgKikgKENGR19USU1FUkJBU0UgKyBDTlRMX1RJTUVSKSkgPSB2YWw7CisKKwkvKiBpbml0IHRoZSB0aW1lc3RhbXAgYW5kIGxhc3RkZWMgdmFsdWUgKi8KKwlyZXNldF90aW1lcl9tYXNrZWQoKTsKKyAJCisgCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3RpbWVyX21hc2tlZCAodm9pZCkKK3sKKwkvKiByZXNldCB0aW1lICovCisJbGFzdGRlYyA9IFJFQURfVElNRVI7ICAvKiBjYXB1cmUgY3VycmVudCBkZWNyZW1lbnRlciB2YWx1ZSB0aW1lICovCisJdGltZXN0YW1wID0gMDsgICAgICAgICAvKiBzdGFydCAiYWR2YW5jaW5nIiB0aW1lIHN0YW1wIGZyb20gMCAqLworfQorCisjaWZkZWYgIENGR19VREVMQVkKKworc3RhdGljIHVsb25nIGdldF90aW1lcl9tYXNrZWQgKHZvaWQpOworc3RhdGljIHVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSk7CisKKy8qIGRlbGF5IHggdXNlY29uZHMgQU5EIHBlcnNlcnZlIGFkdmFuY2UgdGltc3RhbXAgdmFsdWUgKi8KK3ZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCit7CisJdWxvbmcgdG1vLCB0bXA7CisKKwlpZih1c2VjID49IDEwMDApeyAgICAgICAgICAgICAgIC8qIGlmICJiaWciIG51bWJlciwgc3ByZWFkIG5vcm1hbGl6YXRpb24gdG8gc2Vjb25kcyAqLworCQl0bW8gPSB1c2VjIC8gMTAwMDsgICAgICAvKiBzdGFydCB0byBub3JtYWxpemUgZm9yIHVzZWMgdG8gdGlja3MgcGVyIHNlYyAqLworCQl0bW8gKj0gQ0ZHX0haOyAgICAgICAgICAvKiBmaW5kIG51bWJlciBvZiAidGlja3MiIHRvIHdhaXQgdG8gYWNoaWV2ZSB0YXJnZXQgKi8KKwkJdG1vIC89IDEwMDA7ICAgICAgICAgICAgLyogZmluaXNoIG5vcm1hbGl6ZS4gKi8KKwl9ZWxzZXsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2Ugc21hbGwgbnVtYmVyLCBkb24ndCBraWxsIGl0IHByaW9yIHRvIEhaIG11bHRpcGx5ICovCisJCXRtbyA9IHVzZWMgKiBDRkdfSFo7CisJCXRtbyAvPSAoMTAwMCoxMDAwKTsKKwl9CisKKwl0bXAgPSBnZXRfdGltZXIgKDApOwkJLyogZ2V0IGN1cnJlbnQgdGltZXN0YW1wICovCisJaWYoICh0bW8gKyB0bXApIDwgdG1wICkgCS8qIGlmIHNldHRpbmcgdGhpcyBmb3Jkd2FyZCB3aWxsIHJvbGwgdGltZSBzdGFtcCAqLworCQlyZXNldF90aW1lcl9tYXNrZWQgKCk7CS8qIHJlc2V0ICJhZHZhbmNpbmciIHRpbWVzdGFtcCB0byAwLCBzZXQgbGFzdGRlYyB2YWx1ZSAqLworCWVsc2UKKwkJdG1vICs9IHRtcDsJCS8qIGVsc2UsIHNldCBhZHZhbmNpbmcgc3RhbXAgd2FrZSB1cCB0aW1lICovCisKKwl3aGlsZSAoZ2V0X3RpbWVyX21hc2tlZCAoKSA8IHRtbykvKiBsb29wIHRpbGwgZXZlbnQgKi8KKwkJLypOT1AqLzsKK30KKyAKK3N0YXRpYyB1bG9uZyBnZXRfdGltZXJfbWFza2VkICh2b2lkKQoreworCXVsb25nIG5vdyA9IFJFQURfVElNRVI7CQkvKiBjdXJyZW50IHRpY2sgdmFsdWUgKi8KKworCWlmIChsYXN0ZGVjID49IG5vdykgewkJLyogbm9ybWFsIG1vZGUgKG5vbiByb2xsKSAqLworCQkvKiBub3JtYWwgbW9kZSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyAtIG5vdzsgLyogbW92ZSBzdGFtcCBmb3Jkd2FyZCB3aXRoIGFic291bHRlIGRpZmYgdGlja3MgKi8KKwl9IGVsc2UgewkJCS8qIHdlIGhhdmUgb3ZlcmZsb3cgb2YgdGhlIGNvdW50IGRvd24gdGltZXIgKi8KKwkJLyogbnRzID0gdHMgKyBsZCArIChUTFYgLSBub3cpCisJCSAqIHRzPW9sZCBzdGFtcCwgbGQ9dGltZSB0aGF0IHBhc3NlZCBiZWZvcmUgcGFzc2luZyB0aHJvdWdoIC0xCisJCSAqIChUTFYtbm93KSBhbW91bnQgb2YgdGltZSBhZnRlciBwYXNzaW5nIHRob3VnaCAtMQorCQkgKiBudHMgPSBuZXcgImFkdmFuY2luZyB0aW1lIHN0YW1wIi4uLml0IGNvdWxkIGFsc28gcm9sbCBhbmQgY2F1c2UgcHJvYmxlbXMuCisJCSAqLworCQl0aW1lc3RhbXAgKz0gbGFzdGRlYyArIFRJTUVSX0xPQURfVkFMIC0gbm93OworCX0KKwlsYXN0ZGVjID0gbm93OworCisJcmV0dXJuIHRpbWVzdGFtcDsKK30KKworc3RhdGljIHVsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKK3sKKwlyZXR1cm4gZ2V0X3RpbWVyX21hc2tlZCAoKSAtIGJhc2U7Cit9CisKKyNlbmRpZiAJCS8qIENGR19VREVMQVkgKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9zdGFydC5TIGIveC1sb2FkZXIvY3B1L2FybTkyNmVqcy9zdGFydC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTFkYWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvYXJtOTI2ZWpzL3N0YXJ0LlMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAgYXJtYm9vdCAtIFN0YXJ0dXAgQ29kZSBmb3IgQVJNOTI2RUpTIENQVS1jb3JlCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAgLS0tLS0gQWRhcHRlZCBmb3IgT01BUDE2MTAgZnJvbSBBUk05MjV0IGNvZGUgLS0tLS0tCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMQlNYXJpdXMgR3L2Z2VyIDxtYWdAc3lzZ28uZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyCUFsZXggWvxwa2UgPGF6dUBzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJR2FyeSBKZW5uZWpvaG4gPGdqQGRlbnguZGU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAzCVJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJS3NoaXRpaiA8a3NoaXRpakB0aS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CUppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApCisjaW5jbHVkZSA8Li9jb25maWdzL29tYXAxNTEwLmg+CisjZW5kaWYKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSnVtcCB2ZWN0b3IgdGFibGUgYXMgaW4gdGFibGUgMy4xIGluIFsxXQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisuZ2xvYmwgX3N0YXJ0Citfc3RhcnQ6CisJYglyZXNldAorIAlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisKK19oYW5nOgorIAkud29yZCBkb19oYW5nCisgIAorCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTdGFydHVwIENvZGUgKHJlc2V0IHZlY3RvcikKKyAqCisgKiBkbyBpbXBvcnRhbnQgaW5pdCBvbmx5IGlmIHdlIGRvbid0IHN0YXJ0IGZyb20gbWVtb3J5IQorICogc2V0dXAgTWVtb3J5IGFuZCBib2FyZCBzcGVjaWZpYyBiaXRzIHByaW9yIHRvIHJlbG9jYXRpb24uCisgKiByZWxvY2F0ZSBhcm1ib290IHRvIHJhbQorICogc2V0dXAgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK19URVhUX0JBU0U6CisJLndvcmQJVEVYVF9CQVNFCisKKy5nbG9ibCBfYXJtYm9vdF9zdGFydAorX2FybWJvb3Rfc3RhcnQ6CisJLndvcmQgX3N0YXJ0CisKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KKyAqLworLmdsb2JsIF9ic3Nfc3RhcnQKK19ic3Nfc3RhcnQ6CisJLndvcmQgX19ic3Nfc3RhcnQKKworLmdsb2JsIF9ic3NfZW5kCitfYnNzX2VuZDoKKwkud29yZCBfZW5kCisKKyAKKy8qCisgKiB0aGUgYWN0dWFsIHJlc2V0IGNvZGUKKyAqLworCityZXNldDoKKwkvKgorCSAqIHNldCB0aGUgY3B1IHRvIFNWQzMyIG1vZGUKKwkgKi8KKwltcnMJcjAsY3BzcgorCWJpYwlyMCxyMCwjMHgxZgorCW9ycglyMCxyMCwjMHhkMworCW1zcgljcHNyLHIwCisgIAorCS8qCisJICogdHVybiBvZmYgdGhlIHdhdGNoZG9nLCB1bmxvY2svZGlhYmxlIHNlcXVlbmNlCisJICovCisJbW92CXIxLCAjMHhGNQorCWxkcglyMCwgPVdEVElNX01PREUKKwlzdHJoCXIxLCBbcjBdCisJbW92CXIxLCAjMHhBMAorCXN0cmgJcjEsIFtyMF0KKworCisJLyoKKwkgKiBtYXNrIGFsbCBJUlFzIGJ5IHNldHRpbmcgYWxsIGJpdHMgaW4gdGhlIElOVE1SIC0gZGVmYXVsdAorCSAqLworCisJbW92CXIxLCAjMHhmZmZmZmZmZgorCWxkcglyMCwgPVJFR19JSEwxX01JUgorCXN0cglyMSwgW3IwXQorCWxkcglyMCwgPVJFR19JSEwyX01JUgorCXN0cglyMSwgW3IwXQorIAorCS8qCisJICogd2UgZG8gc3lzLWNyaXRpY2FsIGluaXRzIGF0IHJlYm9vdCwKKyAJICovCisgCWJsCWNwdV9pbml0X2NyaXQgCisgIAorCS8qIAorCSAqIHJlbG9jYXRlIGV4Y2VwdGlvbiB2ZWN0b3JzIHRvIFNSQU0gd2hlcmUgUk9NIGNvZGUgZXhwZWN0cworCSAqLworI2lmZGVmIENGR19CT09UX0NTMAorCisJYWRyCXIwLCBfc3RhcnQJCS8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisgCWFkZCAgICAgcjAsIHIwLCAjNAkvKiBza2lwIHJlc2V0IHZlY3RvcgkJCSovCisJbW92CXIyLCAjMzYJCS8qIHIyIDwtIHNpemUgb2YgZGF0YSAoOCsxIHdvcmRzKSAgICAgICAgICAgICovCisJYWRkCXIyLCByMCwgcjIJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisJbW92IHIxLCAjMHgyMDAwMDAwMAorbmV4dDoKKwlsZG1pYQlyMCEsIHtyMy1yMTB9CQkvKiBjb3B5IGZyb20gc291cmNlIGFkZHJlc3MgW3IwXSAgICAqLworCXN0bWlhCXIxISwge3IzLXIxMH0JCS8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCisJYmxlCW5leHQKKworI2VuZGlmCisgCityZWxvY2F0ZToJCQkJLyogcmVsb2NhdGUgWC1Mb2FkZXIgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIGRvbid0IHJlbG9jIGR1cmluZyBkZWJ1ZyAgICAgICAgICovCisJLypiZXEgICAgIHN0YWNrX3NldHVwKi8KKworCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKKwlsZHIJcjMsIF9ic3Nfc3RhcnQKKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKworY29weV9sb29wOgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZXNzIFtyMl0gICAgKi8KKwlibGUJY29weV9sb29wCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCitzdGFja19zZXR1cDoKKwlsZHIJcjAsIF9URVhUX0JBU0UJCS8qIHVwcGVyIDEyOCBLaUI6IHJlbG9jYXRlZCBYLUxvYWRlciAgICovCisgIAlzdWIJc3AsIHIwLCAjMTI4CQkvKiBsZWF2ZSAzMiB3b3JkcyBmb3IgYWJvcnQtc3RhY2sgICAgKi8KKworY2xlYXJfYnNzOgorCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAkJLyogc3RhcnQgYXQgZmlyc3QgYnl0ZSBvZiBic3MgICAgICAgKi8KKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLworCW1vdiAJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitjbGJzc19sOnN0cglyMiwgW3IwXQkJLyogY2xlYXIgbG9vcC4uLiAgICAgICAgICAgICAgICAgICAgKi8KKwlhZGQJcjAsIHIwLCAjNAorCWNtcAlyMCwgcjEKKwlibmUJY2xic3NfbAorCisgCWxkcglwYywgX3N0YXJ0X2FybWJvb3QKKworX3N0YXJ0X2FybWJvb3Q6CisJLndvcmQgIHN0YXJ0X2FybWJvb3QKKworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKKyAqCisgKiBzZXR1cCBpbXBvcnRhbnQgcmVnaXN0ZXJzCisgKiBzZXR1cCBtZW1vcnkgdGltaW5nCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKK2NwdV9pbml0X2NyaXQ6CisJLyoKKwkgKiBmbHVzaCB2NCBJL0QgY2FjaGVzCisJICovCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzcsIDAJLyogZmx1c2ggdjMvdjQgY2FjaGUgKi8KKwltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCS8qIGZsdXNoIHY0IFRMQiAqLworCisJLyoKKwkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCisJICovCisJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAorCWJpYwlyMCwgcjAsICMweDAwMDAyMzAwCS8qIGNsZWFyIGJpdHMgMTMsIDk6OCAoLS1WLSAtLVJTKSAqLworCWJpYwlyMCwgcjAsICMweDAwMDAwMDg3CS8qIGNsZWFyIGJpdHMgNywgMjowIChCLS0tIC1DQU0pICovCisJb3JyCXIwLCByMCwgIzB4MDAwMDAwMDIJLyogc2V0IGJpdCAyIChBKSBBbGlnbiAqLworCW9ycglyMCwgcjAsICMweDAwMDAxMDAwCS8qIHNldCBiaXQgMTIgKEkpIEktQ2FjaGUgKi8KKwltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCisKKwkvKgorCSAqIEdvIHNldHVwIE1lbW9yeSBhbmQgYm9hcmQgc3BlY2lmaWMgYml0cyBwcmlvciB0byByZWxvY2F0aW9uLgorCSAqLworCW1vdglpcCwgbHIJCS8qIHBlcnNlcnZlIGxpbmsgcmVnIGFjcm9zcyBjYWxsICovCisJYmwJcGxhdGZvcm1zZXR1cAkvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworCW1vdglsciwgaXAJCS8qIHJlc3RvcmUgbGluayAqLworCW1vdglwYywgbHIJCS8qIGJhY2sgdG8gbXkgY2FsbGVyICovCisgIAorLyoKKyAqIGV4Y2VwdGlvbiBoYW5kbGVyCisgKi8KKyAJLmFsaWduICA1Citkb19oYW5nOgorCWxkcglzcCwgX1RFWFRfQkFTRQkJLyogdXNlIDMyIHdvcmRzIGFib3J0IHN0YWNrICovCisgICAJYmwJaGFuZwkJCQkvKiBoYW5nIGFuZCBuZXZlciByZXR1cm4gKi8KKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9jcHUvb21hcDMvTWFrZWZpbGUgYi94LWxvYWRlci9jcHUvb21hcDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxZTc2OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ3IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDAzCisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJPSAkKG9iailsaWIkKENQVSkuYQorCitTVEFSVAk6PSBzdGFydC5vCitDT0JKUwk6PSBjcHUubyBtbWMubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9jb25maWcubWsgYi94LWxvYWRlci9jcHUvb21hcDMvY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmUzMjgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvY29uZmlnLm1rCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAyCisjIEdhcnkgSmVubmVqb2huLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCA8Z2pAZGVueC5kZT4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKK1BMQVRGT1JNX1JFTEZMQUdTICs9IC1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZm5vLWNvbW1vbiAtZmZpeGVkLXI4CisKK1BMQVRGT1JNX0NQUEZMQUdTICs9IC1tYXJjaD1hcm12Ny1hCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU3VwcGx5IG9wdGlvbnMgYWNjb3JkaW5nIHRvIGNvbXBpbGVyIHZlcnNpb24KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUExBVEZPUk1fQ1BQRkxBR1MgKz0kKGNhbGwgY2Mtb3B0aW9uLC1tYXBjcy0zMiwtbWFiaT1hcGNzLWdudSkKK1BMQVRGT1JNX0NQUEZMQUdTICs9JChjYWxsIGNjLW9wdGlvbiwtbW5vLXRodW1iLWludGVyd29yaywpCitQTEFURk9STV9SRUxGTEFHUyArPSQoY2FsbCBjYy1vcHRpb24sLW1zaG9ydC1sb2FkLWJ5dGVzLCQoY2FsbCBjYy1vcHRpb24sLW1hbGlnbm1lbnQtdHJhcHMsKSkKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9jcHUuYyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y0MjJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL2NwdS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQtMjAwNiBUZXhhcyBJbnN0dXJtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBHYXJ5IEplbm5lam9obiwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgPGdqQGRlbnguZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIENQVSBzcGVjaWZpYyBjb2RlCisgKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKworLyogU2VlIGFsc28gQVJNIFJlZi4gTWFuLiAqLworI2RlZmluZSBDMV9NTVUJCSgxPDwwKQkJLyogbW11IG9mZi9vbiAqLworI2RlZmluZSBDMV9BTElHTgkoMTw8MSkJCS8qIGFsaWdubWVudCBmYXVsdHMgb2ZmL29uICovCisjZGVmaW5lIEMxX0RDCQkoMTw8MikJCS8qIGRjYWNoZSBvZmYvb24gKi8KKyNkZWZpbmUgQzFfV0IJCSgxPDwzKQkJLyogbWVyZ2luZyB3cml0ZSBidWZmZXIgb24vb2ZmICovCisjZGVmaW5lIEMxX0JJR19FTkRJQU4JKDE8PDcpCS8qIGJpZyBlbmRpYW4gb2ZmL29uICovCisjZGVmaW5lIEMxX1NZU19QUk9UCSgxPDw4KQkJLyogc3lzdGVtIHByb3RlY3Rpb24gKi8KKyNkZWZpbmUgQzFfUk9NX1BST1QJKDE8PDkpCQkvKiBST00gcHJvdGVjdGlvbiAqLworI2RlZmluZSBDMV9JQwkJKDE8PDEyKQkJLyogaWNhY2hlIG9mZi9vbiAqLworI2RlZmluZSBDMV9ISUdIX1ZFQ1RPUlMJKDE8PDEzKQkvKiBsb2NhdGlvbiBvZiB2ZWN0b3JzOiBsb3cvaGlnaCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUkVTRVJWRURfMQkoMHhmIDw8IDMpCS8qIG11c3QgYmUgMTExYiBmb3IgUi9XICovCisKK2ludCBjcHVfaW5pdCAodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvY3B1L29tYXAzL21tYy5jIGIveC1sb2FkZXIvY3B1L29tYXAzL21tYy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2NWRmNDkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9jcHUvb21hcDMvbW1jLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDgKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDxraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPG1tYy5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKworI2lmZGVmIENGR19DTURfTU1DCisKKyNpbmNsdWRlICJtbWNfaG9zdF9kZWYuaCIKKyNpbmNsdWRlICJtbWNfcHJvdG9jb2wuaCIKKworI2RlZmluZSBPTUFQX01NQ19NQVNURVJfQ0xPQ0sgICA5NjAwMDAwMAorZXh0ZXJuIGludCBmYXRfcmVnaXN0ZXJfZGV2aWNlKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydF9ubyk7CisKK21tY19jYXJkX2RhdGEgY3VyX2NhcmRfZGF0YTsKK3N0YXRpYyBibG9ja19kZXZfZGVzY190IG1tY19ibGtfZGV2OworCitibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KQoreworCXJldHVybiAoKGJsb2NrX2Rldl9kZXNjX3QgKikgJm1tY19ibGtfZGV2KTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfYm9hcmRfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQgKENPTkZJR19PTUFQMzRYWCkgJiYgIWRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pCisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKKworCXZhbHVlID0gQ09OVFJPTF9QQklBU19MSVRFOworCUNPTlRST0xfUEJJQVNfTElURSA9IHZhbHVlIHwgKDEgPDwgMikgfCAoMSA8PCAxKSB8ICgxIDw8IDkpOworCisJdmFsdWUgPSBDT05UUk9MX0RFVl9DT05GMDsKKwlDT05UUk9MX0RFVl9DT05GMCA9IHZhbHVlIHwgKDEgPDwgMjQpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgbW1jX2luaXRfc3RyZWFtKHZvaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50IG1tY19zdGF0OworCisJT01BUF9IU01NQ19DT04gfD0gSU5JVF9JTklUU1RSRUFNOworCisJT01BUF9IU01NQ19DTUQgPSBNTUNfQ01EMDsKKwlkbyB7CisJCW1tY19zdGF0ID0gT01BUF9IU01NQ19TVEFUOworCX0gd2hpbGUgKCEobW1jX3N0YXQgJiBDQ19NQVNLKSk7CisKKwlPTUFQX0hTTU1DX1NUQVQgPSBDQ19NQVNLOworCisJT01BUF9IU01NQ19DTUQgPSBNTUNfQ01EMDsKKwlkbyB7CisJCW1tY19zdGF0ID0gT01BUF9IU01NQ19TVEFUOworCX0gd2hpbGUgKCEobW1jX3N0YXQgJiBDQ19NQVNLKSk7CisKKwlPTUFQX0hTTU1DX1NUQVQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJT01BUF9IU01NQ19DT04gJj0gfklOSVRfSU5JVFNUUkVBTTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfY2xvY2tfY29uZmlnKHVuc2lnbmVkIGludCBpY2xrLCB1bnNpZ25lZCBzaG9ydCBjbGtfZGl2KQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwltbWNfcmVnX291dChPTUFQX0hTTU1DX1NZU0NUTCwgKElDRV9NQVNLIHwgRFRPX01BU0sgfCBDRU5fTUFTSyksCisJCSAgICAoSUNFX1NUT1AgfCBEVE9fMTVUSERUTyB8IENFTl9ESVNBQkxFKSk7CisKKwlzd2l0Y2ggKGljbGspIHsKKwljYXNlIENMS19JTklUU0VROgorCQl2YWwgPSBNTUNfSU5JVF9TRVFfQ0xLIC8gMjsKKwkJYnJlYWs7CisJY2FzZSBDTEtfNDAwS0haOgorCQl2YWwgPSBNTUNfNDAwa0h6X0NMSzsKKwkJYnJlYWs7CisJY2FzZSBDTEtfTUlTQzoKKwkJdmFsID0gY2xrX2RpdjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCW1tY19yZWdfb3V0KE9NQVBfSFNNTUNfU1lTQ1RMLAorCQkgICAgSUNFX01BU0sgfCBDTEtEX01BU0ssICh2YWwgPDwgQ0xLRF9PRkZTRVQpIHwgSUNFX09TQ0lMTEFURSk7CisKKwl3aGlsZSAoKE9NQVBfSFNNTUNfU1lTQ1RMICYgSUNTX01BU0spID09IElDU19OT1RSRUFEWSk7CisKKworCU9NQVBfSFNNTUNfU1lTQ1RMIHw9IENFTl9FTkFCTEU7CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX2luaXRfc2V0dXAodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbDsKKworCW1tY19ib2FyZF9pbml0KCk7CisKKwlPTUFQX0hTTU1DX1NZU0NPTkZJRyB8PSBNTUNfU09GVFJFU0VUOworCXdoaWxlICgoT01BUF9IU01NQ19TWVNTVEFUVVMgJiBSRVNFVERPTkUpID09IDApIDsKKworCU9NQVBfSFNNTUNfU1lTQ1RMIHw9IFNPRlRSRVNFVEFMTDsKKwl3aGlsZSAoKE9NQVBfSFNNTUNfU1lTQ1RMICYgU09GVFJFU0VUQUxMKSAhPSAweDApIDsKKworCU9NQVBfSFNNTUNfSENUTCA9IERUV18xX0JJVE1PREUgfCBTREJQX1BXUk9GRiB8IFNEVlNfM1YwOworCU9NQVBfSFNNTUNfQ0FQQSB8PSBWUzMwXzNWMFNVUCB8IFZTMThfMVY4U1VQOworCisJcmVnX3ZhbCA9IE9NQVBfSFNNTUNfQ09OICYgUkVTRVJWRURfTUFTSzsKKworCU9NQVBfSFNNTUNfQ09OID0gQ1RQTF9NTUNfU0QgfCByZWdfdmFsIHwgV1BQX0FDVElWRUhJR0ggfAorCSAgICBDRFBfQUNUSVZFSElHSCB8IE1JVF9DVE8gfCBEVzhfMV80QklUTU9ERSB8IE1PREVfRlVOQyB8CisJICAgIFNUUl9CTE9DSyB8IEhSX05PSE9TVFJFU1AgfCBJTklUX05PSU5JVCB8IE5PT1BFTkRSQUlOOworCisJbW1jX2Nsb2NrX2NvbmZpZyhDTEtfSU5JVFNFUSwgMCk7CisJT01BUF9IU01NQ19IQ1RMIHw9IFNEQlBfUFdST047CisKKwlPTUFQX0hTTU1DX0lFID0gMHgzMDdmMDAzMzsKKworCW1tY19pbml0X3N0cmVhbSgpOworCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19zZW5kX2NtZCh1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnLAorCQkJICAgdW5zaWduZWQgaW50ICpyZXNwb25zZSkKK3sKKwl1bnNpZ25lZCBpbnQgbW1jX3N0YXQ7CisKKwl3aGlsZSAoKE9NQVBfSFNNTUNfUFNUQVRFICYgREFUSV9NQVNLKSA9PSBEQVRJX0NNRERJUyk7CisKKworCU9NQVBfSFNNTUNfQkxLID0gQkxFTl81MTJCWVRFU0xFTiB8IE5CTEtfU1RQQ05UOworCU9NQVBfSFNNTUNfU1RBVCA9IDB4RkZGRkZGRkY7CisJT01BUF9IU01NQ19BUkcgPSBhcmc7CisJT01BUF9IU01NQ19DTUQgPSBjbWQgfCBDTURfVFlQRV9OT1JNQUwgfCBDSUNFX05PQ0hFQ0sgfAorCSAgICBDQ0NFX05PQ0hFQ0sgfCBNU0JTX1NHTEVCTEsgfCBBQ0VOX0RJU0FCTEUgfCBCQ0VfRElTQUJMRSB8CisJICAgIERFX0RJU0FCTEU7CisKKwl3aGlsZSAoMSkgeworCQlkbyB7CisJCQltbWNfc3RhdCA9IE9NQVBfSFNNTUNfU1RBVDsKKwkJfSB3aGlsZSAobW1jX3N0YXQgPT0gMCk7CisKKwkJaWYgKChtbWNfc3RhdCAmIEVSUklfTUFTSykgIT0gMCkKKwkJCXJldHVybiAodW5zaWduZWQgY2hhciltbWNfc3RhdDsKKworCisJCWlmIChtbWNfc3RhdCAmIENDX01BU0spIHsKKwkJCU9NQVBfSFNNTUNfU1RBVCA9IENDX01BU0s7CisJCQlyZXNwb25zZVswXSA9IE9NQVBfSFNNTUNfUlNQMTA7CisJCQlpZiAoKGNtZCAmIFJTUF9UWVBFX01BU0spID09IFJTUF9UWVBFX0xHSFQxMzYpIHsKKwkJCQlyZXNwb25zZVsxXSA9IE9NQVBfSFNNTUNfUlNQMzI7CisJCQkJcmVzcG9uc2VbMl0gPSBPTUFQX0hTTU1DX1JTUDU0OworCQkJCXJlc3BvbnNlWzNdID0gT01BUF9IU01NQ19SU1A3NjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG1tY19yZWFkX2RhdGEodW5zaWduZWQgaW50ICpvdXRwdXRfYnVmKQoreworCXVuc2lnbmVkIGludCBtbWNfc3RhdDsKKwl1bnNpZ25lZCBpbnQgcmVhZF9jb3VudCA9IDA7CisKKwkvKgorCSAqIFN0YXJ0IFBvbGxlZCBSZWFkCisJICovCisJd2hpbGUgKDEpIHsKKwkJZG8geworCQkJbW1jX3N0YXQgPSBPTUFQX0hTTU1DX1NUQVQ7CisJCX0gd2hpbGUgKG1tY19zdGF0ID09IDApOworCisJCWlmICgobW1jX3N0YXQgJiBFUlJJX01BU0spICE9IDApCisJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpbW1jX3N0YXQ7CisKKwkJaWYgKG1tY19zdGF0ICYgQlJSX01BU0spIHsKKwkJCXVuc2lnbmVkIGludCBrOworCisJCQlPTUFQX0hTTU1DX1NUQVQgfD0gQlJSX01BU0s7CisJCQlmb3IgKGsgPSAwOyBrIDwgTU1DU0RfU0VDVE9SX1NJWkUgLyA0OyBrKyspIHsKKwkJCQkqb3V0cHV0X2J1ZiA9IE9NQVBfSFNNTUNfREFUQTsKKwkJCQlvdXRwdXRfYnVmKys7CisJCQkJcmVhZF9jb3VudCArPSA0OworCQkJfQorCQl9CisKKwkJaWYgKG1tY19zdGF0ICYgQldSX01BU0spCisJCQlPTUFQX0hTTU1DX1NUQVQgfD0gQldSX01BU0s7CisKKwkJaWYgKG1tY19zdGF0ICYgVENfTUFTSykgeworCQkJT01BUF9IU01NQ19TVEFUIHw9IFRDX01BU0s7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgY2hhciBtbWNfZGV0ZWN0X2NhcmQobW1jX2NhcmRfZGF0YSAqbW1jX2NhcmRfY3VyKQoreworCXVuc2lnbmVkIGNoYXIgZXJyOworCXVuc2lnbmVkIGludCBhcmd1bWVudCA9IDA7CisJdW5zaWduZWQgaW50IG9jcl92YWx1ZSwgb2NyX3JlY3ZkLCByZXRfY21kNDEsIGhjc192YWw7CisJdW5zaWduZWQgaW50IHJlc3BbNF07CisJdW5zaWduZWQgc2hvcnQgcmV0cnlfY250ID0gMjAwMDsKKworCS8qIFNldCB0byBJbml0aWFsaXphdGlvbiBDbG9jayAqLworCWVyciA9IG1tY19jbG9ja19jb25maWcoQ0xLXzQwMEtIWiwgMCk7CisJaWYgKGVyciAhPSAxKQorCQlyZXR1cm4gZXJyOworCisJbW1jX2NhcmRfY3VyLT5SQ0EgPSBNTUNfUkVMQVRJVkVfQ0FSRF9BRERSRVNTOworCWFyZ3VtZW50ID0gMHgwMDAwMDAwMDsKKworCW9jcl92YWx1ZSA9ICgweDFGRiA8PCAxNSk7CisJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQwLCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKGVyciAhPSAxKQorCQlyZXR1cm4gZXJyOworCisJYXJndW1lbnQgPSBTRF9DTUQ4X0NIRUNLX1BBVFRFUk4gfCBTRF9DTUQ4XzJfN18zXzZfVl9SQU5HRTsKKwllcnIgPSBtbWNfc2VuZF9jbWQoTU1DX1NEQ01EOCwgYXJndW1lbnQsIHJlc3ApOworCWhjc192YWwgPSAoZXJyID09IDEpID8KKwkgICAgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX1NFQ1RPUiA6CisJICAgIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9CWVRFOworCisJYXJndW1lbnQgPSAweDAwMDAgPDwgMTY7CisJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ1NSwgYXJndW1lbnQsIHJlc3ApOworCWlmIChlcnIgPT0gMSkgeworCQltbWNfY2FyZF9jdXItPmNhcmRfdHlwZSA9IFNEX0NBUkQ7CisJCW9jcl92YWx1ZSB8PSBoY3NfdmFsOworCQlyZXRfY21kNDEgPSBNTUNfQUNNRDQxOworCX0gZWxzZSB7CisJCW1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID0gTU1DX0NBUkQ7CisJCW9jcl92YWx1ZSB8PSBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9TRUNUT1I7CisJCXJldF9jbWQ0MSA9IE1NQ19DTUQxOworCQlPTUFQX0hTTU1DX0NPTiAmPSB+T0Q7CisJCU9NQVBfSFNNTUNfQ09OIHw9IE9QRU5EUkFJTjsKKwl9CisKKwlhcmd1bWVudCA9IG9jcl92YWx1ZTsKKwllcnIgPSBtbWNfc2VuZF9jbWQocmV0X2NtZDQxLCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKGVyciAhPSAxKQorCQlyZXR1cm4gZXJyOworCisJb2NyX3JlY3ZkID0gKChtbWNfcmVzcF9yMyAqKSByZXNwKS0+b2NyOworCisJd2hpbGUgKCEob2NyX3JlY3ZkICYgKDB4MSA8PCAzMSkpICYmIChyZXRyeV9jbnQgPiAwKSkgeworCQlyZXRyeV9jbnQtLTsKKwkJaWYgKG1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID09IFNEX0NBUkQpIHsKKwkJCWFyZ3VtZW50ID0gMHgwMDAwIDw8IDE2OworCQkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQ1NSwgYXJndW1lbnQsIHJlc3ApOworCQl9CisKKwkJYXJndW1lbnQgPSBvY3JfdmFsdWU7CisJCWVyciA9IG1tY19zZW5kX2NtZChyZXRfY21kNDEsIGFyZ3VtZW50LCByZXNwKTsKKwkJaWYgKGVyciAhPSAxKQorCQkJcmV0dXJuIGVycjsKKwkJb2NyX3JlY3ZkID0gKChtbWNfcmVzcF9yMyAqKSByZXNwKS0+b2NyOworCX0KKworCWlmICghKG9jcl9yZWN2ZCAmICgweDEgPDwgMzEpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gTU1DX0NBUkQpIHsKKwkJaWYgKChvY3JfcmVjdmQgJiBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9NQVNLKSA9PQorCQkgICAgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfU0VDVE9SKSB7CisJCQltbWNfY2FyZF9jdXItPm1vZGUgPSBTRUNUT1JfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCW1tY19jYXJkX2N1ci0+bW9kZSA9IEJZVEVfTU9ERTsKKwkJfQorCisJCW9jcl9yZWN2ZCAmPSB+TU1DX09DUl9SRUdfQUNDRVNTX01PREVfTUFTSzsKKwl9IGVsc2UgeworCQlpZiAoKG9jcl9yZWN2ZCAmIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9NQVNLKQorCQkgICAgPT0gTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX1NFQ1RPUikgeworCQkJbW1jX2NhcmRfY3VyLT5tb2RlID0gU0VDVE9SX01PREU7CisJCX0gZWxzZSB7CisJCQltbWNfY2FyZF9jdXItPm1vZGUgPSBCWVRFX01PREU7CisJCX0KKwkJb2NyX3JlY3ZkICY9IH5NTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfTUFTSzsKKwl9CisKKwlvY3JfcmVjdmQgJj0gfigweDEgPDwgMzEpOworCWlmICghKG9jcl9yZWN2ZCAmIG9jcl92YWx1ZSkpCisJCXJldHVybiAwOworCisJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQyLCBhcmd1bWVudCwgcmVzcCk7CisJaWYgKGVyciAhPSAxKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG1tY19jYXJkX2N1ci0+Y2FyZF90eXBlID09IE1NQ19DQVJEKSB7CisJCWFyZ3VtZW50ID0gbW1jX2NhcmRfY3VyLT5SQ0EgPDwgMTY7CisJCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01EMywgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSB7CisJCWFyZ3VtZW50ID0gMHgwMDAwMDAwMDsKKwkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19TRENNRDMsIGFyZ3VtZW50LCByZXNwKTsKKwkJaWYgKGVyciAhPSAxKQorCQkJcmV0dXJuIGVycjsKKworCQltbWNfY2FyZF9jdXItPlJDQSA9ICgobW1jX3Jlc3BfcjYgKikgcmVzcCktPm5ld3B1Ymxpc2hlZHJjYTsKKwl9CisKKwlPTUFQX0hTTU1DX0NPTiAmPSB+T0Q7CisJT01BUF9IU01NQ19DT04gfD0gTk9PUEVORFJBSU47CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgbW1jX3JlYWRfY2FyZHNpemUobW1jX2NhcmRfZGF0YSAqbW1jX2Rldl9kYXRhLAorCQkJCW1tY19jc2RfcmVnX3QgKmN1cl9jc2QpCit7CisJbW1jX2V4dGVuZGVkX2NzZF9yZWdfdCBleHRfY3NkOworCXVuc2lnbmVkIGludCBzaXplLCBjb3VudCwgYmxrX2xlbiwgYmxrX25vLCBjYXJkX3NpemUsIGFyZ3VtZW50OworCXVuc2lnbmVkIGNoYXIgZXJyOworCXVuc2lnbmVkIGludCByZXNwWzRdOworCisJaWYgKG1tY19kZXZfZGF0YS0+bW9kZSA9PSBTRUNUT1JfTU9ERSkgeworCQlpZiAobW1jX2Rldl9kYXRhLT5jYXJkX3R5cGUgPT0gU0RfQ0FSRCkgeworCQkJY2FyZF9zaXplID0KKwkJCSAgICAoKChtbWNfc2QyX2NzZF9yZWdfdCAqKSBjdXJfY3NkKS0+CisJCQkgICAgIGNfc2l6ZV9sc2IgJiBNTUNfU0QyX0NTRF9DX1NJWkVfTFNCX01BU0spIHwKKwkJCSAgICAoKCgobW1jX3NkMl9jc2RfcmVnX3QgKikgY3VyX2NzZCktPgorCQkJICAgICAgY19zaXplX21zYiAmIE1NQ19TRDJfQ1NEX0NfU0laRV9NU0JfTUFTSykKKwkJCSAgICAgPDwgTU1DX1NEMl9DU0RfQ19TSVpFX01TQl9PRkZTRVQpOworCQkJbW1jX2Rldl9kYXRhLT5zaXplID0gY2FyZF9zaXplICogMTAyNDsKKwkJCWlmIChtbWNfZGV2X2RhdGEtPnNpemUgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWFyZ3VtZW50ID0gMHgwMDAwMDAwMDsKKwkJCWVyciA9IG1tY19zZW5kX2NtZChNTUNfQ01EOCwgYXJndW1lbnQsIHJlc3ApOworCQkJaWYgKGVyciAhPSAxKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSBtbWNfcmVhZF9kYXRhKCh1bnNpZ25lZCBpbnQgKikmZXh0X2NzZCk7CisJCQlpZiAoZXJyICE9IDEpCisJCQkJcmV0dXJuIGVycjsKKwkJCW1tY19kZXZfZGF0YS0+c2l6ZSA9IGV4dF9jc2Quc2VjdG9yY291bnQ7CisKKwkJCWlmIChtbWNfZGV2X2RhdGEtPnNpemUgPT0gMCkKKwkJCQltbWNfZGV2X2RhdGEtPnNpemUgPSA4Mzg4NjA4OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGN1cl9jc2QtPmNfc2l6ZV9tdWx0ID49IDgpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY3VyX2NzZC0+cmVhZF9ibF9sZW4gPj0gMTIpCisJCQlyZXR1cm4gMDsKKworCQkvKiBDb21wdXRlIHNpemUgKi8KKwkJY291bnQgPSAxIDw8IChjdXJfY3NkLT5jX3NpemVfbXVsdCArIDIpOworCQljYXJkX3NpemUgPSAoY3VyX2NzZC0+Y19zaXplX2xzYiAmIE1NQ19DU0RfQ19TSVpFX0xTQl9NQVNLKSB8CisJCSAgICAoKGN1cl9jc2QtPmNfc2l6ZV9tc2IgJiBNTUNfQ1NEX0NfU0laRV9NU0JfTUFTSykKKwkJICAgICA8PCBNTUNfQ1NEX0NfU0laRV9NU0JfT0ZGU0VUKTsKKworCQlibGtfbm8gPSAoY2FyZF9zaXplICsgMSkgKiBjb3VudDsKKwkJYmxrX2xlbiA9IDEgPDwgY3VyX2NzZC0+cmVhZF9ibF9sZW47CisJCXNpemUgPSBibGtfbm8gKiBibGtfbGVuOworCisJCW1tY19kZXZfZGF0YS0+c2l6ZSA9IHNpemUgLyBNTUNTRF9TRUNUT1JfU0laRTsKKwkJaWYgKG1tY19kZXZfZGF0YS0+c2l6ZSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit1bnNpZ25lZCBjaGFyIG9tYXBfbW1jX3JlYWRfc2VjdCh1bnNpZ25lZCBpbnQgc3RhcnRfc2VjLCB1bnNpZ25lZCBpbnQgbnVtX2J5dGVzLAorCQkJCSBtbWNfY2FyZF9kYXRhICptbWNfYywKKwkJCQkgdW5zaWduZWQgaW50ICpvdXRwdXRfYnVmKQoreworCXVuc2lnbmVkIGNoYXIgZXJyOworCXVuc2lnbmVkIGludCBhcmd1bWVudDsKKwl1bnNpZ25lZCBpbnQgcmVzcFs0XTsKKwl1bnNpZ25lZCBpbnQgbnVtX3NlY192YWwgPQorCSAgICAobnVtX2J5dGVzICsgKE1NQ1NEX1NFQ1RPUl9TSVpFIC0gMSkpIC8gTU1DU0RfU0VDVE9SX1NJWkU7CisJdW5zaWduZWQgaW50IHNlY19pbmNfdmFsOworCisJaWYgKG51bV9zZWNfdmFsID09IDApCisJCXJldHVybiAxOworCisJaWYgKG1tY19jLT5tb2RlID09IFNFQ1RPUl9NT0RFKSB7CisJCWFyZ3VtZW50ID0gc3RhcnRfc2VjOworCQlzZWNfaW5jX3ZhbCA9IDE7CisJfSBlbHNlIHsKKwkJYXJndW1lbnQgPSBzdGFydF9zZWMgKiBNTUNTRF9TRUNUT1JfU0laRTsKKwkJc2VjX2luY192YWwgPSBNTUNTRF9TRUNUT1JfU0laRTsKKwl9CisKKwl3aGlsZSAobnVtX3NlY192YWwpIHsKKwkJZXJyID0gbW1jX3NlbmRfY21kKE1NQ19DTUQxNywgYXJndW1lbnQsIHJlc3ApOworCQlpZiAoZXJyICE9IDEpCisJCQlyZXR1cm4gZXJyOworCisKKwkJZXJyID0gbW1jX3JlYWRfZGF0YShvdXRwdXRfYnVmKTsKKwkJaWYgKGVyciAhPSAxKQorCQkJcmV0dXJuIGVycjsKKworCQlvdXRwdXRfYnVmICs9IChNTUNTRF9TRUNUT1JfU0laRSAvIDQpOworCQlhcmd1bWVudCArPSBzZWNfaW5jX3ZhbDsKKwkJbnVtX3NlY192YWwtLTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGNoYXIgY29uZmlndXJlX21tYyhtbWNfY2FyZF9kYXRhICptbWNfY2FyZF9jdXIpCit7CisJdW5zaWduZWQgY2hhciByZXRfdmFsOworCXVuc2lnbmVkIGludCBhcmd1bWVudDsKKwl1bnNpZ25lZCBpbnQgcmVzcFs0XTsKKwl1bnNpZ25lZCBpbnQgdHJhbnNfZmFjdCwgdHJhbnNfdW5pdCwgcmV0cmllcyA9IDI7CisJdW5zaWduZWQgaW50IG1heF9kdHI7CisJaW50IGRzb3I7CisJdm9sYXRpbGUgbW1jX2NzZF9yZWdfdCBDYXJkX0NTRDsKKwl1bnNpZ25lZCBjaGFyIHRyYW5zX3NwZWVkOworCisJbW1jX2luaXRfc2V0dXAoKTsKKworCWRvIHsKKwkJcmV0X3ZhbCA9IG1tY19kZXRlY3RfY2FyZChtbWNfY2FyZF9jdXIpOworCQlyZXRyaWVzLS07CisJfSB3aGlsZSAoKHJldHJpZXMgPiAwKSAmJiAocmV0X3ZhbCAhPSAxKSk7CisKKwlhcmd1bWVudCA9IG1tY19jYXJkX2N1ci0+UkNBIDw8IDE2OworCXJldF92YWwgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDksIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCSgodW5zaWduZWQgaW50ICopJkNhcmRfQ1NEKVszXSA9IHJlc3BbM107CisJKCh1bnNpZ25lZCBpbnQgKikmQ2FyZF9DU0QpWzJdID0gcmVzcFsyXTsKKwkoKHVuc2lnbmVkIGludCAqKSZDYXJkX0NTRClbMV0gPSByZXNwWzFdOworCSgodW5zaWduZWQgaW50ICopJkNhcmRfQ1NEKVswXSA9IHJlc3BbMF07CisKKwlpZiAobW1jX2NhcmRfY3VyLT5jYXJkX3R5cGUgPT0gTU1DX0NBUkQpCisJCW1tY19jYXJkX2N1ci0+dmVyc2lvbiA9IENhcmRfQ1NELnNwZWNfdmVyczsKKworCXRyYW5zX3NwZWVkID0gQ2FyZF9DU0QudHJhbl9zcGVlZDsKKworCXJldF92YWwgPSBtbWNfc2VuZF9jbWQoTU1DX0NNRDQsIE1NQ19EU1JfREVGQVVMVCA8PCAxNiwgcmVzcCk7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwl0cmFuc191bml0ID0gdHJhbnNfc3BlZWQgJiBNTUNfQ1NEX1RSQU5fU1BFRURfVU5JVF9NQVNLOworCXRyYW5zX2ZhY3QgPSB0cmFuc19zcGVlZCAmIE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfTUFTSzsKKworCWlmICh0cmFuc191bml0ID4gTU1DX0NTRF9UUkFOX1NQRUVEX1VOSVRfMTAwTUhaKQorCQlyZXR1cm4gMDsKKworCWlmICgodHJhbnNfZmFjdCA8IE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfMV8wKSB8fAorCSAgICAodHJhbnNfZmFjdCA+IE1NQ19DU0RfVFJBTl9TUEVFRF9GQUNUT1JfOF8wKSkKKwkJcmV0dXJuIDA7CisKKwl0cmFuc191bml0ID4+PSAwOworCXRyYW5zX2ZhY3QgPj49IDM7CisKKwltYXhfZHRyID0gdHJhbl9leHBbdHJhbnNfdW5pdF0gKiB0cmFuX21hbnRbdHJhbnNfZmFjdF07CisJZHNvciA9IE9NQVBfTU1DX01BU1RFUl9DTE9DSyAvIG1heF9kdHI7CisKKwlpZiAoZHNvciA9PSA0KQorCQlkc29yID0gNTsKKwlpZiAoZHNvciA9PSAzKQorCQlkc29yID0gNDsKKworCXJldF92YWwgPSBtbWNfY2xvY2tfY29uZmlnKENMS19NSVNDLCBkc29yKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCWFyZ3VtZW50ID0gbW1jX2NhcmRfY3VyLT5SQ0EgPDwgMTY7CisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01EN19TRUxFQ1QsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCS8qIENvbmZpZ3VyZSB0aGUgYmxvY2sgbGVuZ3RoIHRvIDUxMiBieXRlcyAqLworCWFyZ3VtZW50ID0gTU1DU0RfU0VDVE9SX1NJWkU7CisJcmV0X3ZhbCA9IG1tY19zZW5kX2NtZChNTUNfQ01EMTYsIGFyZ3VtZW50LCByZXNwKTsKKwlpZiAocmV0X3ZhbCAhPSAxKQorCQlyZXR1cm4gcmV0X3ZhbDsKKworCS8qIGdldCB0aGUgY2FyZCBzaXplIGluIHNlY3RvcnMgKi8KKwlyZXRfdmFsID0gbW1jX3JlYWRfY2FyZHNpemUobW1jX2NhcmRfY3VyLCAobW1jX2NzZF9yZWdfdCAqKSZDYXJkX0NTRCk7CisJaWYgKHJldF92YWwgIT0gMSkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlyZXR1cm4gMTsKK30KKwordW5zaWduZWQgbG9uZyBtbWNfYnJlYWQoaW50IGRldl9udW0sIHVsb25nIGJsa25yLCB1bG9uZyBibGtjbnQsIHVsb25nICpkc3QpCit7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJcmV0ID0gb21hcF9tbWNfcmVhZF9zZWN0KGJsa25yLCAoYmxrY250ICogTU1DU0RfU0VDVE9SX1NJWkUpLAorCQkJJmN1cl9jYXJkX2RhdGEsICh1bnNpZ25lZCBpbnQgKilkc3QpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtbWNfaW5pdChpbnQgdmVyYm9zZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHJldCA9IDA7CisKKwlyZXQgPSBjb25maWd1cmVfbW1jKCZjdXJfY2FyZF9kYXRhKTsKKwlpZiAocmV0ID09IDApCisJCXJldHVybiAwOworCisJbW1jX2Jsa19kZXYuaWZfdHlwZSA9IElGX1RZUEVfTU1DOworCW1tY19ibGtfZGV2LnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9ET1M7CisJbW1jX2Jsa19kZXYuZGV2ID0gMDsKKwltbWNfYmxrX2Rldi5sdW4gPSAwOworCW1tY19ibGtfZGV2LnR5cGUgPSAwOworCisJLyogRklYTUUgZmlsbCBpbiB0aGUgY29ycmVjdCBzaXplIChpcyBzZXQgdG8gMzJNQnl0ZSkgKi8KKwltbWNfYmxrX2Rldi5ibGtzeiA9IE1NQ1NEX1NFQ1RPUl9TSVpFOworCW1tY19ibGtfZGV2LmxiYSA9IDB4MTAwMDA7CisJbW1jX2Jsa19kZXYucmVtb3ZhYmxlID0gMDsKKwltbWNfYmxrX2Rldi5ibG9ja19yZWFkID0gbW1jX2JyZWFkOworCisJZmF0X3JlZ2lzdGVyX2RldmljZSgmbW1jX2Jsa19kZXYsIDEpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBtbWNfcmVhZCh1bnNpZ25lZCBpbnQgc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzaXplKQoreworCS8qCisJICogTk9UIEltcGxlbWVudGVkCisJICovCisJcmV0dXJuIDA7Cit9CitpbnQgbW1jX3dyaXRlKHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgbG9uZyBkc3QsIGludCBzaXplKQoreworCS8qCisJICogTk9UIEltcGxlbWVudGVkCisJICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBtbWMyaW5mbyh1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwkvKgorCSAqIE5PVCBJbXBsZW1lbnRlZAorCSAqLworCXJldHVybiAwOworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfaG9zdF9kZWYuaCBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfaG9zdF9kZWYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNTI2ZjkxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19ob3N0X2RlZi5oCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8a2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIE1NQ19IT1NUX0RFRklOSVRJT05TX0gKKyNkZWZpbmUgTU1DX0hPU1RfREVGSU5JVElPTlNfSAorCisvKgorICogT01BUCBIU01NQyByZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE9NQVBfSFNNTUNfU1lTQ09ORklHCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMDEwKQorI2RlZmluZSBPTUFQX0hTTU1DX1NZU1NUQVRVUwkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzAxNCkKKyNkZWZpbmUgT01BUF9IU01NQ19DT04JCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzAyQykKKyNkZWZpbmUgT01BUF9IU01NQ19CTEsJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEwNCkKKyNkZWZpbmUgT01BUF9IU01NQ19BUkcJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEwOCkKKyNkZWZpbmUgT01BUF9IU01NQ19DTUQJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzEwQykKKyNkZWZpbmUgT01BUF9IU01NQ19SU1AxMAkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMTApCisjZGVmaW5lIE9NQVBfSFNNTUNfUlNQMzIJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTE0KQorI2RlZmluZSBPTUFQX0hTTU1DX1JTUDU0CQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgMHg0ODA5QzExOCkKKyNkZWZpbmUgT01BUF9IU01NQ19SU1A3NgkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMUMpCisjZGVmaW5lIE9NQVBfSFNNTUNfREFUQQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTIwKQorI2RlZmluZSBPTUFQX0hTTU1DX1BTVEFURQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMjQpCisjZGVmaW5lIE9NQVBfSFNNTUNfSENUTAkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTI4KQorI2RlZmluZSBPTUFQX0hTTU1DX1NZU0NUTAkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMkMpCisjZGVmaW5lIE9NQVBfSFNNTUNfU1RBVAkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTMwKQorI2RlZmluZSBPTUFQX0hTTU1DX0lFCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwOUMxMzQpCisjZGVmaW5lIE9NQVBfSFNNTUNfQ0FQQQkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKSAweDQ4MDlDMTQwKQorCisvKiBUMiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDT05UUk9MX0RFVl9DT05GMAkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwMDIyNzQpCisjZGVmaW5lIENPTlRST0xfUEJJQVNfTElURQkJKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopIDB4NDgwMDI1MjApCisKKy8qCisgKiBPTUFQIEhTIE1NQyBCaXQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBNTUNfU09GVFJFU0VUCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUkVTRVRET05FCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIE5PT1BFTkRSQUlOCQkJCQkoMHgwIDw8IDApCisjZGVmaW5lIE9QRU5EUkFJTgkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBPRAkJCQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIElOSVRfTk9JTklUCQkJCQkoMHgwIDw8IDEpCisjZGVmaW5lIElOSVRfSU5JVFNUUkVBTQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIEhSX05PSE9TVFJFU1AJCQkJKDB4MCA8PCAyKQorI2RlZmluZSBTVFJfQkxPQ0sgCQkJCQkoMHgwIDw8IDMpCisjZGVmaW5lIE1PREVfRlVOQwkJCQkJKDB4MCA8PCA0KQorI2RlZmluZSBEVzhfMV80QklUTU9ERSAJCQkJKDB4MCA8PCA1KQorI2RlZmluZSBNSVRfQ1RPCQkJCQkJKDB4MCA8PCA2KQorI2RlZmluZSBDRFBfQUNUSVZFSElHSAkJCQkoMHgwIDw8IDcpCisjZGVmaW5lIFdQUF9BQ1RJVkVISUdIIAkJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJFU0VSVkVEX01BU0sJCQkJKDB4MyA8PCA5KQorI2RlZmluZSBDVFBMX01NQ19TRCAJCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgQkxFTl81MTJCWVRFU0xFTgkJCSgweDIwMCA8PCAwKQorI2RlZmluZSBOQkxLX1NUUENOVAkJCQkJKDB4MCA8PCAxNikKKyNkZWZpbmUgREVfRElTQUJMRQkJCQkJKDB4MCA8PCAwKQorI2RlZmluZSBCQ0VfRElTQUJMRQkJCQkJKDB4MCA8PCAxKQorI2RlZmluZSBBQ0VOX0RJU0FCTEUJCQkJKDB4MCA8PCAyKQorI2RlZmluZSBERElSX09GRlNFVAkJCQkJKDQpCisjZGVmaW5lIERESVJfTUFTSwkJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBERElSX1dSSVRFCQkJCQkoMHgwIDw8IDQpCisjZGVmaW5lIERESVJfUkVBRAkJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBNU0JTX1NHTEVCTEsJCQkJKDB4MCA8PCA1KQorI2RlZmluZSBSU1BfVFlQRV9PRkZTRVQJCQkJKDE2KQorI2RlZmluZSBSU1BfVFlQRV9NQVNLCQkJCSgweDMgPDwgMTYpCisjZGVmaW5lIFJTUF9UWVBFX05PUlNQCQkJCSgweDAgPDwgMTYpCisjZGVmaW5lIFJTUF9UWVBFX0xHSFQxMzYJCQkoMHgxIDw8IDE2KQorI2RlZmluZSBSU1BfVFlQRV9MR0hUNDgJCQkJKDB4MiA8PCAxNikKKyNkZWZpbmUgUlNQX1RZUEVfTEdIVDQ4QgkJCSgweDMgPDwgMTYpCisjZGVmaW5lIENDQ0VfTk9DSEVDSwkJCQkoMHgwIDw8IDE5KQorI2RlZmluZSBDQ0NFX0NIRUNLCQkJCQkoMHgxIDw8IDE5KQorI2RlZmluZSBDSUNFX05PQ0hFQ0sJCQkJKDB4MCA8PCAyMCkKKyNkZWZpbmUgQ0lDRV9DSEVDSwkJCQkJKDB4MSA8PCAyMCkKKyNkZWZpbmUgRFBfT0ZGU0VUCQkJCQkoMjEpCisjZGVmaW5lIERQX01BU0sJCQkJCQkoMHgxIDw8IDIxKQorI2RlZmluZSBEUF9OT19EQVRBCQkJCQkoMHgwIDw8IDIxKQorI2RlZmluZSBEUF9EQVRBCQkJCQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgQ01EX1RZUEVfTk9STUFMCQkJCSgweDAgPDwgMjIpCisjZGVmaW5lIElOREVYX09GRlNFVAkJCQkoMjQpCisjZGVmaW5lIElOREVYX01BU0sJCQkJCSgweDNmIDw8IDI0KQorI2RlZmluZSBJTkRFWChpKQkJCQkJKGkgPDwgMjQpCisjZGVmaW5lIERBVElfTUFTSwkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBEQVRJX0NNRERJUwkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBEVFdfMV9CSVRNT0RFCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgRFRXXzRfQklUTU9ERQkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFNEQlBfUFdST0ZGCQkJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFNEQlBfUFdST04JCQkJCSgweDEgPDwgOCkKKyNkZWZpbmUgU0RWU18xVjgJCQkJCSgweDUgPDwgOSkKKyNkZWZpbmUgU0RWU18zVjAJCQkJCSgweDYgPDwgOSkKKyNkZWZpbmUgSUNFX01BU0sJCQkJCSgweDEgPDwgMCkKKyNkZWZpbmUgSUNFX1NUT1AJCQkJCSgweDAgPDwgMCkKKyNkZWZpbmUgSUNTX01BU0sJCQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgSUNTX05PVFJFQURZCQkJCSgweDAgPDwgMSkKKyNkZWZpbmUgSUNFX09TQ0lMTEFURQkJCQkoMHgxIDw8IDApCisjZGVmaW5lIENFTl9NQVNLCQkJCQkoMHgxIDw8IDIpCisjZGVmaW5lIENFTl9ESVNBQkxFCQkJCQkoMHgwIDw8IDIpCisjZGVmaW5lIENFTl9FTkFCTEUJCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgQ0xLRF9PRkZTRVQJCQkJCSg2KQorI2RlZmluZSBDTEtEX01BU0sJCQkJCSgweDNGRiA8PCA2KQorI2RlZmluZSBEVE9fTUFTSwkJCQkJKDB4RiA8PCAxNikKKyNkZWZpbmUgRFRPXzE1VEhEVE8JCQkJCSgweEUgPDwgMTYpCisjZGVmaW5lIFNPRlRSRVNFVEFMTAkJCQkoMHgxIDw8IDI0KQorI2RlZmluZSBDQ19NQVNLCQkJCQkJKDB4MSA8PCAwKQorI2RlZmluZSBUQ19NQVNLCQkJCQkJKDB4MSA8PCAxKQorI2RlZmluZSBCV1JfTUFTSwkJCQkJKDB4MSA8PCA0KQorI2RlZmluZSBCUlJfTUFTSwkJCQkJKDB4MSA8PCA1KQorI2RlZmluZSBFUlJJX01BU0sJCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIElFX0NDCQkJCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgSUVfVEMJCQkJCQkoMHgwMSA8PCAxKQorI2RlZmluZSBJRV9CV1IJCQkJCQkoMHgwMSA8PCA0KQorI2RlZmluZSBJRV9CUlIJCQkJCQkoMHgwMSA8PCA1KQorI2RlZmluZSBJRV9DVE8JCQkJCQkoMHgwMSA8PCAxNikKKyNkZWZpbmUgSUVfQ0NSQwkJCQkJCSgweDAxIDw8IDE3KQorI2RlZmluZSBJRV9DRUIJCQkJCQkoMHgwMSA8PCAxOCkKKyNkZWZpbmUgSUVfQ0lFCQkJCQkJKDB4MDEgPDwgMTkpCisjZGVmaW5lIElFX0RUTwkJCQkJCSgweDAxIDw8IDIwKQorI2RlZmluZSBJRV9EQ1JDCQkJCQkJKDB4MDEgPDwgMjEpCisjZGVmaW5lIElFX0RFQgkJCQkJCSgweDAxIDw8IDIyKQorI2RlZmluZSBJRV9DRVJSCQkJCQkJKDB4MDEgPDwgMjgpCisjZGVmaW5lIElFX0JBREEJCQkJCQkoMHgwMSA8PCAyOSkKKworI2RlZmluZSBWUzMwXzNWMFNVUAkJCQkJKDEgPDwgMjUpCisjZGVmaW5lIFZTMThfMVY4U1VQCQkJCQkoMSA8PCAyNikKKworLyogRHJpdmVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIE1NQ1NEX1NFQ1RPUl9TSVpFCQkoNTEyKQorI2RlZmluZSBNTUNfQ0FSRAkJCQkwCisjZGVmaW5lIFNEX0NBUkQJCQkJCTEKKyNkZWZpbmUgQllURV9NT0RFCQkJCTAKKyNkZWZpbmUgU0VDVE9SX01PREUJCQkJMQorI2RlZmluZSBDTEtfSU5JVFNFUQkJCQkwCisjZGVmaW5lIENMS180MDBLSFoJCQkJMQorI2RlZmluZSBDTEtfTUlTQwkJCQkyCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY2FyZF90eXBlOworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCXVuc2lnbmVkIGludCBtb2RlOworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBSQ0E7Cit9IG1tY19jYXJkX2RhdGE7CisKKyNkZWZpbmUgbW1jX3JlZ19vdXQoYWRkciwgbWFzaywgdmFsKSBcCisJKGFkZHIpID0gKCgoYWRkcikpICYgKH4obWFzaykpICkgfCAoICh2YWwpICYgKG1hc2spKTsKKworI2VuZGlmCQkJCS8qIE1NQ19IT1NUX0RFRklOSVRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfcHJvdG9jb2wuaCBiL3gtbG9hZGVyL2NwdS9vbWFwMy9tbWNfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDdlYjJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvY3B1L29tYXAzL21tY19wcm90b2NvbC5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA4CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8a2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIE1NQ19QUk9UT0NPTF9ICisjZGVmaW5lIE1NQ19QUk9UT0NPTF9ICisKKyNpbmNsdWRlICJtbWNfaG9zdF9kZWYuaCIKKworLyogUmVzcG9uc2VzICovCisjZGVmaW5lIFJTUF9UWVBFX05PTkUJKFJTUF9UWVBFX05PUlNQICAgfCBDQ0NFX05PQ0hFQ0sgfCBDSUNFX05PQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1IxCQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1IxQgkoUlNQX1RZUEVfTEdIVDQ4QiB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1IyCQkoUlNQX1RZUEVfTEdIVDEzNiB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfTk9DSEVDSykKKyNkZWZpbmUgUlNQX1RZUEVfUjMJCShSU1BfVFlQRV9MR0hUNDggIHwgQ0NDRV9OT0NIRUNLIHwgQ0lDRV9OT0NIRUNLKQorI2RlZmluZSBSU1BfVFlQRV9SNAkJKFJTUF9UWVBFX0xHSFQ0OCAgfCBDQ0NFX05PQ0hFQ0sgfCBDSUNFX05PQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1I1CQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1I2CQkoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfQ0hFQ0spCisjZGVmaW5lIFJTUF9UWVBFX1I3ICAgICAoUlNQX1RZUEVfTEdIVDQ4ICB8IENDQ0VfQ0hFQ0sgICB8IENJQ0VfQ0hFQ0spCisKKy8qIEFsbCBzdXBwb3J0ZWQgY29tbWFuZHMgKi8KKyNkZWZpbmUgTU1DX0NNRDAJKElOREVYKDApICB8IFJTUF9UWVBFX05PTkUgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDEJKElOREVYKDEpICB8IFJTUF9UWVBFX1IzICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDIJKElOREVYKDIpICB8IFJTUF9UWVBFX1IyICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDMJKElOREVYKDMpICB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX1NEQ01EMwkoSU5ERVgoMykgIHwgUlNQX1RZUEVfUjYgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01ENAkoSU5ERVgoNCkgIHwgUlNQX1RZUEVfTk9ORSB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01ENgkoSU5ERVgoNikgIHwgUlNQX1RZUEVfUjFCICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EN19TRUxFQ1QJKElOREVYKDcpICB8IFJTUF9UWVBFX1IxQiAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDdfREVTRUxFQ1QgXAorCShJTkRFWCg3KSAgfCBSU1BfVFlQRV9OT05FIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQ4CShJTkRFWCg4KSAgfCBSU1BfVFlQRV9SMSAgIHwgRFBfREFUQSAgICB8IERESVJfUkVBRCkKKyNkZWZpbmUgTU1DX1NEQ01EOAkoSU5ERVgoOCkgIHwgUlNQX1RZUEVfUjcgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EOQkoSU5ERVgoOSkgIHwgUlNQX1RZUEVfUjIgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTIJKElOREVYKDEyKSB8IFJTUF9UWVBFX1IxQiAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDEzCShJTkRFWCgxMykgfCBSU1BfVFlQRV9SMSAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19DTUQxNQkoSU5ERVgoMTUpIHwgUlNQX1RZUEVfTk9ORSB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQ01EMTYJKElOREVYKDE2KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKyNkZWZpbmUgTU1DX0NNRDE3CShJTkRFWCgxNykgfCBSU1BfVFlQRV9SMSAgIHwgRFBfREFUQSAgICB8IERESVJfUkVBRCkKKyNkZWZpbmUgTU1DX0NNRDI0CShJTkRFWCgyNCkgfCBSU1BfVFlQRV9SMSAgIHwgRFBfREFUQSAgICB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19BQ01ENgkoSU5ERVgoNikgIHwgUlNQX1RZUEVfUjEgICB8IERQX05PX0RBVEEgfCBERElSX1dSSVRFKQorI2RlZmluZSBNTUNfQUNNRDQxCShJTkRFWCg0MSkgfCBSU1BfVFlQRV9SMyAgIHwgRFBfTk9fREFUQSB8IERESVJfV1JJVEUpCisjZGVmaW5lIE1NQ19BQ01ENTEJKElOREVYKDUxKSB8IFJTUF9UWVBFX1IxICAgfCBEUF9EQVRBICAgIHwgRERJUl9SRUFEKQorI2RlZmluZSBNTUNfQ01ENTUJKElOREVYKDU1KSB8IFJTUF9UWVBFX1IxICAgfCBEUF9OT19EQVRBIHwgRERJUl9XUklURSkKKworI2RlZmluZSBNTUNfQUNfQ01EX1JDQV9NQVNLICAgICAodW5zaWduZWQgaW50KSgweEZGRkYgPDwgMTYpCisjZGVmaW5lIE1NQ19CQ19DTURfRFNSX01BU0sgICAgICh1bnNpZ25lZCBpbnQpKDB4RkZGRiA8PCAxNikKKyNkZWZpbmUgTU1DX0RTUl9ERUZBVUxUICAgICAgICAgKDB4MDQwNCkKKyNkZWZpbmUgU0RfQ01EOF9DSEVDS19QQVRURVJOICAgICAgICgweEFBKQorI2RlZmluZSBTRF9DTUQ4XzJfN18zXzZfVl9SQU5HRSAgICAgKDB4MDEgPDwgOCkKKworLyogQ2xvY2sgQ29uZmlndXJhdGlvbnMgYW5kIE1hY3JvcyAqLworCisjZGVmaW5lIE1NQ19DTE9DS19SRUZFUkVOQ0UJCSg5NikKKyNkZWZpbmUgTU1DX1JFTEFUSVZFX0NBUkRfQUREUkVTUwkoMHgxMjM0KQorI2RlZmluZSBNTUNfSU5JVF9TRVFfQ0xLCQkoTU1DX0NMT0NLX1JFRkVSRU5DRSAqIDEwMDAgLyA4MCkKKyNkZWZpbmUgTU1DXzQwMGtIel9DTEsJCQkoTU1DX0NMT0NLX1JFRkVSRU5DRSAqIDEwMDAgLyA0MDApCisjZGVmaW5lIENMS0RSKHIsIGYsIHUpCQkJKCgoKHIpKjEwMCkgLyAoKGYpKih1KSkpICsgMSkKKyNkZWZpbmUgQ0xLRChmLCB1KQkJCShDTEtEUihNTUNfQ0xPQ0tfUkVGRVJFTkNFLCBmLCB1KSkKKworI2RlZmluZSBNTUNfT0NSX1JFR19BQ0NFU1NfTU9ERV9NQVNLCSgweDMgPDwgMjkpCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0FDQ0VTU19NT0RFX0JZVEUgICAgKDB4MCA8PCAyOSkKKyNkZWZpbmUgTU1DX09DUl9SRUdfQUNDRVNTX01PREVfU0VDVE9SICAoMHgyIDw8IDI5KQorCisjZGVmaW5lIE1NQ19PQ1JfUkVHX0hPU1RfQ0FQQUNJVFlfU1VQUE9SVF9NQVNLCQkoMHgxIDw8IDMwKQorI2RlZmluZSBNTUNfT0NSX1JFR19IT1NUX0NBUEFDSVRZX1NVUFBPUlRfQllURQkJKDB4MCA8PCAzMCkKKyNkZWZpbmUgTU1DX09DUl9SRUdfSE9TVF9DQVBBQ0lUWV9TVVBQT1JUX1NFQ1RPUgkoMHgxIDw8IDMwKQorCisjZGVmaW5lIE1NQ19TRDJfQ1NEX0NfU0laRV9MU0JfTUFTSyAgICAgICAgICgweEZGRkYpCisjZGVmaW5lIE1NQ19TRDJfQ1NEX0NfU0laRV9NU0JfTUFTSyAgICAgICAgICgweDAwM0YpCisjZGVmaW5lIE1NQ19TRDJfQ1NEX0NfU0laRV9NU0JfT0ZGU0VUICAgICAgICgxNikKKyNkZWZpbmUgTU1DX0NTRF9DX1NJWkVfTFNCX01BU0sgICAgICAgICAgICAgKDB4MDAwMykKKyNkZWZpbmUgTU1DX0NTRF9DX1NJWkVfTVNCX01BU0sgICAgICAgICAgICAgKDB4MDNGRikKKyNkZWZpbmUgTU1DX0NTRF9DX1NJWkVfTVNCX09GRlNFVCAgICAgICAgICAgKDIpCisKKyNkZWZpbmUgTU1DX0NTRF9UUkFOX1NQRUVEX1VOSVRfTUFTSyAgICAgICAgKDB4MDcgPDwgMCkKKyNkZWZpbmUgTU1DX0NTRF9UUkFOX1NQRUVEX0ZBQ1RPUl9NQVNLICAgICAgKDB4MEYgPDwgMykKKyNkZWZpbmUgTU1DX0NTRF9UUkFOX1NQRUVEX1VOSVRfMTAwTUhaICAgICAgKDB4MyA8PCAwKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SXzFfMCAgICAgICAoMHgwMSA8PCAzKQorI2RlZmluZSBNTUNfQ1NEX1RSQU5fU1BFRURfRkFDVE9SXzhfMCAgICAgICAoMHgwRiA8PCAzKQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRyYW5fZXhwW10gPSB7CisJMTAwMDAsICAgICAgICAgIDEwMDAwMCwgICAgICAgICAxMDAwMDAwLCAgICAgICAgMTAwMDAwMDAsCisJMCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHJhbl9tYW50W10gPSB7CisJMCwgICAgICAxMCwgICAgIDEyLCAgICAgMTMsICAgICAxNSwgICAgIDIwLCAgICAgMjUsICAgICAzMCwKKwkzNSwgICAgIDQwLCAgICAgNDUsICAgICA1MCwgICAgIDU1LCAgICAgNjAsICAgICA3MCwgICAgIDgwLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIG5vdF91c2VkOjE7CisJdW5zaWduZWQgY3JjOjc7CisJdW5zaWduZWQgZWNjOjI7CisJdW5zaWduZWQgZmlsZV9mb3JtYXQ6MjsKKwl1bnNpZ25lZCB0bXBfd3JpdGVfcHJvdGVjdDoxOworCXVuc2lnbmVkIHBlcm1fd3JpdGVfcHJvdGVjdDoxOworCXVuc2lnbmVkIGNvcHk6MTsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdF9ncnA6MTsKKwl1bnNpZ25lZCBjb250ZW50X3Byb3RfYXBwOjE7CisJdW5zaWduZWQgcmVzZXJ2ZWRfMTo0OworCXVuc2lnbmVkIHdyaXRlX2JsX3BhcnRpYWw6MTsKKwl1bnNpZ25lZCB3cml0ZV9ibF9sZW46NDsKKwl1bnNpZ25lZCByMndfZmFjdG9yOjM7CisJdW5zaWduZWQgZGVmYXVsdF9lY2M6MjsKKwl1bnNpZ25lZCB3cF9ncnBfZW5hYmxlOjE7CisJdW5zaWduZWQgd3BfZ3JwX3NpemU6NTsKKwl1bnNpZ25lZCBlcmFzZV9ncnBfbXVsdDo1OworCXVuc2lnbmVkIGVyYXNlX2dycF9zaXplOjU7CisJdW5zaWduZWQgY19zaXplX211bHQ6MzsKKwl1bnNpZ25lZCB2ZGRfd19jdXJyX21heDozOworCXVuc2lnbmVkIHZkZF93X2N1cnJfbWluOjM7CisJdW5zaWduZWQgdmRkX3JfY3Vycl9tYXg6MzsKKwl1bnNpZ25lZCB2ZGRfcl9jdXJyX21pbjozOworCXVuc2lnbmVkIGNfc2l6ZV9sc2I6MjsKKwl1bnNpZ25lZCBjX3NpemVfbXNiOjEwOworCXVuc2lnbmVkIHJlc2VydmVkXzI6MjsKKwl1bnNpZ25lZCBkc3JfaW1wOjE7CisJdW5zaWduZWQgcmVhZF9ibGtfbWlzYWxpZ246MTsKKwl1bnNpZ25lZCB3cml0ZV9ibGtfbWlzYWxpZ246MTsKKwl1bnNpZ25lZCByZWFkX2JsX3BhcnRpYWw6MTsKKwl1bnNpZ25lZCByZWFkX2JsX2xlbjo0OworCXVuc2lnbmVkIGNjYzoxMjsKKwl1bnNpZ25lZCB0cmFuX3NwZWVkOjg7CisJdW5zaWduZWQgbnNhYzo4OworCXVuc2lnbmVkIHRhYWM6ODsKKwl1bnNpZ25lZCByZXNlcnZlZF8zOjI7CisJdW5zaWduZWQgc3BlY192ZXJzOjQ7CisJdW5zaWduZWQgY3NkX3N0cnVjdHVyZToyOworfSBtbWNfY3NkX3JlZ190OworCisvKiBjc2QgZm9yIHNkMi4wICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbm90X3VzZWQ6MTsKKwl1bnNpZ25lZCBjcmM6NzsKKwl1bnNpZ25lZCByZXNlcnZlZF8xOjI7CisJdW5zaWduZWQgZmlsZV9mb3JtYXQ6MjsKKwl1bnNpZ25lZCB0bXBfd3JpdGVfcHJvdGVjdDoxOworCXVuc2lnbmVkIHBlcm1fd3JpdGVfcHJvdGVjdDoxOworCXVuc2lnbmVkIGNvcHk6MTsKKwl1bnNpZ25lZCBmaWxlX2Zvcm1hdF9ncnA6MTsKKwl1bnNpZ25lZCByZXNlcnZlZF8yOjU7CisJdW5zaWduZWQgd3JpdGVfYmxfcGFydGlhbDoxOworCXVuc2lnbmVkIHdyaXRlX2JsX2xlbjo0OworCXVuc2lnbmVkIHIyd19mYWN0b3I6MzsKKwl1bnNpZ25lZCByZXNlcnZlZF8zOjI7CisJdW5zaWduZWQgd3BfZ3JwX2VuYWJsZToxOworCXVuc2lnbmVkIHdwX2dycF9zaXplOjc7CisJdW5zaWduZWQgc2VjdG9yX3NpemU6NzsKKwl1bnNpZ25lZCBlcmFzZV9ibGtfbGVuOjE7CisJdW5zaWduZWQgcmVzZXJ2ZWRfNDoxOworCXVuc2lnbmVkIGNfc2l6ZV9sc2I6MTY7CisJdW5zaWduZWQgY19zaXplX21zYjo2OworCXVuc2lnbmVkIHJlc2VydmVkXzU6NjsKKwl1bnNpZ25lZCBkc3JfaW1wOjE7CisJdW5zaWduZWQgcmVhZF9ibGtfbWlzYWxpZ246MTsKKwl1bnNpZ25lZCB3cml0ZV9ibGtfbWlzYWxpZ246MTsKKwl1bnNpZ25lZCByZWFkX2JsX3BhcnRpYWw6MTsKKwl1bnNpZ25lZCByZWFkX2JsX2xlbjo0OworCXVuc2lnbmVkIGNjYzoxMjsKKwl1bnNpZ25lZCB0cmFuX3NwZWVkOjg7CisJdW5zaWduZWQgbnNhYzo4OworCXVuc2lnbmVkIHRhYWM6ODsKKwl1bnNpZ25lZCByZXNlcnZlZF82OjY7CisJdW5zaWduZWQgY3NkX3N0cnVjdHVyZToyOworfSBtbWNfc2QyX2NzZF9yZWdfdDsKKworLyogZXh0ZW5kZWQgY3NkIC0gNTEyIGJ5dGVzIGxvbmcgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzFbMTgxXTsKKwl1bnNpZ25lZCBjaGFyIGVyYXNlZG1lbW9yeWNvbnRlbnQ7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8yOworCXVuc2lnbmVkIGNoYXIgYnVzd2lkdGhtb2RlOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMzsKKwl1bnNpZ25lZCBjaGFyIGhpZ2hzcGVlZGludGVyZmFjZXRpbWluZzsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzQ7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfNTsKKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRzZXRyZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzY7CisJdW5zaWduZWQgY2hhciBjb21tYW5kc2V0OworCXVuc2lnbmVkIGNoYXIgZXh0ZW5kZWRjc2RyZXZpc2lvbjsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkXzc7CisJdW5zaWduZWQgY2hhciBjc2RzdHJ1Y3R1cmV2ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfODsKKwl1bnNpZ25lZCBjaGFyIGNhcmR0eXBlOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfOVszXTsKKwl1bnNpZ25lZCBjaGFyIHBvd2VyY2xhc3NfNTJtaHpfMV85NXY7CisJdW5zaWduZWQgY2hhciBwb3dlcmNsYXNzXzI2bWh6XzFfOTV2OworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzc181Mm1oel8zXzZ2OworCXVuc2lnbmVkIGNoYXIgcG93ZXJjbGFzc18yNm1oel8zXzZ2OworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRfMTA7CisJdW5zaWduZWQgY2hhciBtaW5yZWFkcGVyZl80Yl8yNm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbndyaXRlcGVyZl80Yl8yNm1oejsKKwl1bnNpZ25lZCBjaGFyIG1pbnJlYWRwZXJmXzhiXzI2bWh6XzRiXzUybWh6OworCXVuc2lnbmVkIGNoYXIgbWlud3JpdGVwZXJmXzhiXzI2bWh6XzRiXzUybWh6OworCXVuc2lnbmVkIGNoYXIgbWlucmVhZHBlcmZfOGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciBtaW53cml0ZXBlcmZfOGJfNTJtaHo7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xMTsKKwl1bnNpZ25lZCBpbnQgc2VjdG9yY291bnQ7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xMlsyODhdOworCXVuc2lnbmVkIGNoYXIgc3VwcG9ydGVkY29tbWFuZHNldHM7CisJdW5zaWduZWQgY2hhciByZXNlcnZlZF8xM1s3XTsKK30gbW1jX2V4dGVuZGVkX2NzZF9yZWdfdDsKKworLyogbW1jIHNkIHJlc3BvbmNlICovCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IG9jcjsKK30gbW1jX3Jlc3BfcjM7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBzaG9ydCBjYXJkc3RhdHVzOworCXVuc2lnbmVkIHNob3J0IG5ld3B1Ymxpc2hlZHJjYTsKK30gbW1jX3Jlc3BfcjY7CisKK2V4dGVybiBtbWNfY2FyZF9kYXRhIG1tY19kZXY7CisKK3Vuc2lnbmVkIGNoYXIgbW1jX2xvd2xldmVsX2luaXQodm9pZCk7Cit1bnNpZ25lZCBjaGFyIG1tY19zZW5kX2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50IGFyZywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKnJlc3BvbnNlKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3NldHVwX2Nsb2NrKHVuc2lnbmVkIGludCBpY2xrLCB1bnNpZ25lZCBzaG9ydCBjbGtkKTsKK3Vuc2lnbmVkIGNoYXIgbW1jX3NldF9vcGVuZHJhaW4odW5zaWduZWQgY2hhciBzdGF0ZSk7Cit1bnNpZ25lZCBjaGFyIG1tY19yZWFkX2RhdGEodW5zaWduZWQgaW50ICpvdXRwdXRfYnVmKTsKKworI2VuZGlmCQkJCS8qTU1DX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2NwdS9vbWFwMy9zdGFydC5TIGIveC1sb2FkZXIvY3B1L29tYXAzL3N0YXJ0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ODkzNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2NwdS9vbWFwMy9zdGFydC5TCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIE9NUDI0MjAvQVJNMTEzNiBDUFUtY29yZQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiAgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIJQWxleCBa/HBrZSA8YXp1QHN5c2dvLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMglHYXJ5IEplbm5lam9obiA8Z2pAZGVueC5kZT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMJUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogIENvcHlyaWdodCAoYykgMjAwMwlLc2hpdGlqIDxrc2hpdGlqQHRpLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQJSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisKKy5nbG9ibCBfc3RhcnQKK19zdGFydDoKKwliCXJlc2V0CisgCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKwlsZHIJcGMsIF9oYW5nCisJbGRyCXBjLCBfaGFuZworCWxkcglwYywgX2hhbmcKKworX2hhbmc6CisgCS53b3JkIGRvX2hhbmcKKworCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzgKKwkud29yZCAweDEyMzQ1Njc4CisJLndvcmQgMHgxMjM0NTY3OAorCS53b3JkIDB4MTIzNDU2NzggLyogbm93IDE2KjQ9NjQgKi8KKworLmdsb2JhbCBfZW5kX3ZlY3QKK19lbmRfdmVjdDoKKworCS5iYWxpZ25sIDE2LDB4ZGVhZGJlZWYKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXJ0dXAgQ29kZSAocmVzZXQgdmVjdG9yKQorICoKKyAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBtZW1vcnkhCisgKiBzZXR1cCBNZW1vcnkgYW5kIGJvYXJkIHNwZWNpZmljIGJpdHMgcHJpb3IgdG8gcmVsb2NhdGlvbi4KKyAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCisgKiBzZXR1cCBzdGFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworX1RFWFRfQkFTRToKKwkud29yZAlURVhUX0JBU0UKKworI2lmbmRlZiBTVEFDS19CQVNFCisjZGVmaW5lIFNUQUNLX0JBU0UgVEVYVF9CQVNFCisjZW5kaWYKKwkKK19TVEFDS19CQVNFOgorICAgIC53b3JkICAgU1RBQ0tfQkFTRQorCisuZ2xvYmwgX2FybWJvb3Rfc3RhcnQKK19hcm1ib290X3N0YXJ0OgorCS53b3JkIF9zdGFydAorCisvKgorICogVGhlc2UgYXJlIGRlZmluZWQgaW4gdGhlIGJvYXJkLXNwZWNpZmljIGxpbmtlciBzY3JpcHQuCisgKi8KKy5nbG9ibCBfYnNzX3N0YXJ0CitfYnNzX3N0YXJ0OgorCS53b3JkIF9fYnNzX3N0YXJ0CisKKy5nbG9ibCBfYnNzX2VuZAorX2Jzc19lbmQ6CisJLndvcmQgX2VuZAorCisvKgorICogdGhlIGFjdHVhbCByZXNldCBjb2RlCisgKi8KKworcmVzZXQ6CisJLyoKKwkgKiBzZXQgdGhlIGNwdSB0byBTVkMzMiBtb2RlCisJICovCisJbXJzCXIwLGNwc3IKKwliaWMJcjAscjAsIzB4MWYKKwlvcnIJcjAscjAsIzB4ZDMKKwltc3IJY3BzcixyMAorCisJLyogQ29weSB2ZWN0b3JzIHRvIG1hc2sgUk9NIGluZGlyZWN0IGFkZHIgKi8KKwlhZHIgICAgIHIwLCBfc3RhcnQgICAgICAgICAgICAgIC8qIHIwIDwtIGN1cnJlbnQgcG9zaXRpb24gb2YgY29kZSAgICovCisJYWRkICAgICByMCwgcjAsICM0CQkJCS8qIHNraXAgcmVzZXQgdmVjdG9yCQkJKi8KKwltb3YgICAgIHIyLCAjNjQgICAgICAgICAgICAgICAgIC8qIHIyIDwtIHNpemUgdG8gY29weSAgKi8KKwlhZGQgICAgIHIyLCByMCwgcjIgICAgICAgICAgICAgIC8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcyAgICAgICAgICovCisJbW92ICAgICByMSwgI1NSQU1fT0ZGU0VUMCAgICAgICAgIC8qIGJ1aWxkIHZlY3QgYWRkciAqLworCW1vdiAgICAgcjMsICNTUkFNX09GRlNFVDEKKwlhZGQgICAgIHIxLCByMSwgcjMKKwltb3YgICAgIHIzLCAjU1JBTV9PRkZTRVQyCisJYWRkICAgICByMSwgcjEsIHIzCituZXh0OgorCWxkbWlhICAgcjAhLCB7cjMtcjEwfSAgICAgICAgICAgLyogY29weSBmcm9tIHNvdXJjZSBhZGRyZXNzIFtyMF0gICAgKi8KKwlzdG1pYSAgIHIxISwge3IzLXIxMH0gICAgICAgICAgIC8qIGNvcHkgdG8gICB0YXJnZXQgYWRkcmVzcyBbcjFdICAgICovCisJY21wICAgICByMCwgcjIgICAgICAgICAgICAgICAgICAvKiB1bnRpbCBzb3VyY2UgZW5kIGFkZHJlc3MgW3IyXSAgICAqLworCWJuZSAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgLyogbG9vcCB1bnRpbCBlcXVhbCAqLworCisJYmwJY3B5X2Nsa19jb2RlICAgICAgICAgICAgLyogcHV0IGRwbGwgYWRqdXN0IGNvZGUgYmVoaW5kIHZlY3RvcnMgKi8KKworCS8qIHRoZSBtYXNrIFJPTSBjb2RlIHNob3VsZCBoYXZlIFBMTCBhbmQgb3RoZXJzIHN0YWJsZSAqLworCWJsICBjcHVfaW5pdF9jcml0CisKK3JlbG9jYXRlOgkJCQkvKiByZWxvY2F0ZSBVLUJvb3QgdG8gUkFNCSAgICAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgcjAsIHIxICAgICAgICAgICAgICAgICAgCS8qIG5vIG5lZWQgdG8gcmVsb2NhdGUgaWYgWElQICAgICAgICovCisJYmVxIHN0YWNrX3NldHVwCQkJLyogc2tpcCB0eHQgY3B5IGlmIFhJUChTUkFNLCBTRFJBTSkgKi8KKworCWxkcglyMiwgX2FybWJvb3Rfc3RhcnQKKwlsZHIJcjMsIF9ic3Nfc3RhcnQKKwlzdWIJcjIsIHIzLCByMgkJLyogcjIgPC0gc2l6ZSBvZiBhcm1ib290ICAgICAgICAgICAgKi8KKwlhZGQJcjIsIHIwLCByMgkJLyogcjIgPC0gc291cmNlIGVuZCBhZGRyZXNzICAgICAgICAgKi8KKworY29weV9sb29wOgorCWxkbWlhCXIwISwge3IzLXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCisJc3RtaWEJcjEhLCB7cjMtcjEwfQkJLyogY29weSB0byAgIHRhcmdldCBhZGRyZXNzIFtyMV0gICAgKi8KKwljbXAJcjAsIHIyCQkJLyogdW50aWwgc291cmNlIGVuZCBhZGRyZWVlIFtyMl0gICAgKi8KKwlibGUJY29weV9sb29wCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrCQkJCQkJICAgICovCitzdGFja19zZXR1cDoKKwlsZHIJcjAsIF9TVEFDS19CQVNFCQkvKiB1cHBlciAxMjggS2lCOiByZWxvY2F0ZWQgdWJvb3QgICAqLworCXN1YglzcCwgcjAsICMxMjgJCS8qIGxlYXZlIDMyIHdvcmRzIGZvciBhYm9ydC1zdGFjayAgICovCisJYW5kCXNwLCBzcCwgI343CQkvKiA4IGJ5dGUgYWxpbmdlZCBmb3IgKGxkci9zdHIpZCAgICAqLworCisJLyogQ2xlYXIgQlNTIChpZiBhbnkpLiAgSXMgYmVsb3cgdHggKHdhdGNoIGxvYWQgYWRkciAtIG5lZWQgc3BhY2UpICAqLworY2xlYXJfYnNzOgorCWxkcglyMCwgX2Jzc19zdGFydAkJLyogZmluZCBzdGFydCBvZiBic3Mgc2VnbWVudCAgICAgICAgKi8KKwlsZHIJcjEsIF9ic3NfZW5kCQkvKiBzdG9wIGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAqLworCW1vdiAJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhciB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAqLworY2xic3NfbDoKKwlzdHIJcjIsIFtyMF0JCS8qIGNsZWFyIEJTUyBsb2NhdGlvbiAgICAgICAgICAgICAgICovCisJY21wCXIwLCByMQkJCS8qIGFyZSB3ZSBhdCB0aGUgZW5kIHlldCAgICAgICAgICAgICovCisJYWRkCXIwLCByMCwgIzQJCS8qIGluY3JlbWVudCBjbGVhciBpbmRleCBwb2ludGVyICAgICovCisJYm5lCWNsYnNzX2wgICAgICAgICAgICAgICAgIC8qIGtlZXAgY2xlYXJpbmcgdGlsbCBhdCBlbmQgICAgICAgICovCisKKwlsZHIJcGMsIF9zdGFydF9hcm1ib290CS8qIGp1bXAgdG8gQyBjb2RlICAgICAgICAgICAgICAgICAgICovCisKK19zdGFydF9hcm1ib290Ogkud29yZCBzdGFydF9hcm1ib290CisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ1BVX2luaXRfY3JpdGljYWwgcmVnaXN0ZXJzCisgKgorICogc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycworICogc2V0dXAgbWVtb3J5IHRpbWluZworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK2NwdV9pbml0X2NyaXQ6CisJLyoKKwkgKiBJbnZhbGlkYXRlIEwxIEkvRAorCSAqLworICAgICAgICBtb3YJcjAsICMwICAgICAgICAgICAgICAgICAvKiBzZXQgdXAgZm9yIE1DUiAqLworICAgICAgICBtY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwICAvKiBpbnZhbGlkYXRlIFRMQnMgKi8KKyAgICAgICAgbWNyCXAxNSwgMCwgcjAsIGM3LCBjNSwgMSAgLyogaW52YWxpZGF0ZSBpY2FjaGUgKi8KKworCS8qIEludmFsaWRlIEwyIGNhY2hlIChncCBkZXZpY2UgY2FsbCBwb2ludCkKKwkgKiAtIHdhcm5pbmcsIHRoaXMgbWF5IGhhdmUgaXNzdWVzIG9uIEVNVS9IUyBkZXZpY2VzCisJICogdGhpcyBjYWxsIGNhbiBjb3JydXB0IHIwLXI1CisJICovCisJbW92IHIxMiwgIzB4MQkJQCBzZXQgdXAgdG8gaW52YWxpZGUgTDIKKy8qCisgKiBUT0RPOiBOZWVkIHRvIHJldmVydCBiYWNrIG9uIEdQIGRldmljZS4KKyAqLworLyoKK3NtaTogCS53b3JkIDB4RTE2MDAwNzAJQCBDYWxsIFNNSSBtb25pdG9yCisqLworCS8qCisJICogZGlzYWJsZSBNTVUgc3R1ZmYgYW5kIGNhY2hlcworCSAqLworCW1yYwlwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKwliaWMJcjAsIHIwLCAjMHgwMDAwMjAwMAlAIGNsZWFyIGJpdHMgMTMgKC0tVi0pCisJYmljCXIwLCByMCwgIzB4MDAwMDAwMDcJQCBjbGVhciBiaXRzIDI6MCAoLUNBTSkKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMDAwMglAIHNldCBiaXQgMSAoLS1BLSkgQWxpZ24KKyNpZm5kZWYgQ09ORklHX0lDQUNIRV9PRkYKKwlvcnIJcjAsIHIwLCAjMHgwMDAwMTgwMAlAIHNldCBiaXQgMTEsMTIgKC0tLUkgWi0tLSkgQlRCLEktQ2FjaGUKKyNlbmRpZgorCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAKKworCS8qCisgICAgICAgICAqIEp1bXAgdG8gYm9hcmQgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24uLi4gVGhlIE1hc2sgUk9NIHdpbGwgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICAgICAqIGJhc2ljIG1lbW9yeS4gIEdvIGhlcmUgdG8gYnVtcCB1cCBjbG9jayByYXRlIGFuZCBoYW5kbGUgd2FrZSB1cCBjb25kaXRpb25zLgorCSAqLworCWFkcglyMCwgX3N0YXJ0CQkvKiByMCA8LSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvZGUgICAqLworCWxkcglyMSwgX1RFWFRfQkFTRQkJLyogdGVzdCBpZiB3ZSBydW4gZnJvbSBmbGFzaCBvciBSQU0gKi8KKwljbXAgICAgIHIwLCByMSAgICAgICAgICAgICAgICAgIC8qIHBhc3Mgb24gaW5mbyBhYm91dCBza2lwcGluZyBzb21lIGluaXQgcG9ydGlvbnMgKi8KKwltb3ZlcSAgIHIwLCMweDEgICAgICAgICAgICAgICAgIC8qIGZsYWcgdG8gc2tpcCBwcmNtIGFuZCBzZHJjIHNldHVwICovCisJbW92bmUgICByMCwjMHgwCisKKwltb3YJaXAsIGxyICAgICAgICAgIC8qIHBlcnNldmVyZSBsaW5rIHJlZyBhY3Jvc3MgY2FsbCAqLworCWJsCWxvd2xldmVsX2luaXQgICAvKiBnbyBzZXR1cCBwbGwsbXV4LG1lbW9yeSAqLworCW1vdglsciwgaXAgICAgICAgICAgLyogcmVzdG9yZSBsaW5rICovCisJbW92CXBjLCBsciAgICAgICAgICAvKiBiYWNrIHRvIG15IGNhbGxlciAqLworCisvKgorICogZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworIAkuYWxpZ24gIDUKK2RvX2hhbmc6CisJbGRyCXNwLCBfVEVYVF9CQVNFCQkvKiB1c2UgMzIgd29yZHMgYWJvcnQgc3RhY2sgKi8KKyAgIAlibAloYW5nCQkJLyogaGFuZyBhbmQgbmV2ZXIgcmV0dXJuICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2Rpc2svTWFrZWZpbGUgYi94LWxvYWRlci9kaXNrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmNDA5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kaXNrL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKKyNDRkxBR1MgKz0gLURFVF9ERUJVRyAtRERFQlVHCisKK0xJQgk9ICQob2JqKWxpYmRpc2suYQorCitDT0JKUwk9IHBhcnQubworCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2Rpc2svcGFydC5jIGIveC1sb2FkZXIvZGlzay9wYXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTM2N2YxMwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2Rpc2svcGFydC5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8aWRlLmg+CisjaW5jbHVkZSA8cGFydC5oPgorCisjdW5kZWYJUEFSVF9ERUJVRworCisjaWZkZWYJUEFSVF9ERUJVRworI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBQUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworI2lmICgoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9JREUpCXx8IFwKKyAgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9VU0IpCXx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfTU1DKSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogcmVwb3J0cyBkZXZpY2UgaW5mbyB0byB0aGUgdXNlcgorICovCit2b2lkIGRldl9wcmludCAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpCit7CisjaWZkZWYgQ09ORklHX0xCQTQ4CisJdWludDY0X3QgbGJhNTEyOyAvKiBudW1iZXIgb2YgYmxvY2tzIGlmIDUxMmJ5dGVzIGJsb2NrIHNpemUgKi8KKyNlbHNlCisJbGJhaW50X3QgbGJhNTEyOworI2VuZGlmCisKKwlpZiAoZGV2X2Rlc2MtPnR5cGU9PURFVl9UWVBFX1VOS05PV04pIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGV2X2Rlc2MtPmlmX3R5cGU9PUlGX1RZUEVfU0NTSSkgIHsKKwkJcHJpbnRmICgiKCVkOiVkKSAiLCBkZXZfZGVzYy0+dGFyZ2V0LGRldl9kZXNjLT5sdW4pOworCX0KKwlpZiAoZGV2X2Rlc2MtPmlmX3R5cGU9PUlGX1RZUEVfSURFKSB7CisJCXByaW50ZiAoIk1vZGVsOiAlcyBGaXJtOiAlcyBTZXIjOiAlc1xuIiwKKwkJCWRldl9kZXNjLT52ZW5kb3IsCisJCQlkZXZfZGVzYy0+cmV2aXNpb24sCisJCQlkZXZfZGVzYy0+cHJvZHVjdCk7CisJfSBlbHNlIHsKKwkJcHJpbnRmICgiVmVuZG9yOiAlcyBQcm9kLjogJXMgUmV2OiAlc1xuIiwKKwkJCWRldl9kZXNjLT52ZW5kb3IsCisJCQlkZXZfZGVzYy0+cHJvZHVjdCwKKwkJCWRldl9kZXNjLT5yZXZpc2lvbik7CisJfQorCXByaW50ZiAoIiAgICAgICAgICAgIFR5cGU6ICIpOworCXN3aXRjaCAoZGV2X2Rlc2MtPnR5cGUgJiAweDFGKSB7CisJCWNhc2UgREVWX1RZUEVfSEFSRERJU0s6IHByaW50ZiAoIkhhcmQgRGlzayIpOworCQkJCQlicmVhazsKKwkJY2FzZSBERVZfVFlQRV9DRFJPTTogCXByaW50ZiAoIkNEIFJPTSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBERVZfVFlQRV9PUERJU0s6IAlwcmludGYgKCJPcHRpY2FsIERldmljZSIpOworCQkJCQlicmVhazsKKwkJY2FzZSBERVZfVFlQRV9UQVBFOiAJcHJpbnRmICgiVGFwZSIpOworCQkJCQlicmVhazsKKwkJZGVmYXVsdDoJCXByaW50ZiAoIiMgJTAyWCAjIiwgZGV2X2Rlc2MtPnR5cGUgJiAweDFGKTsKKwkJCQkJYnJlYWs7CisJfQorCWlmICgoZGV2X2Rlc2MtPmxiYSAqIGRldl9kZXNjLT5ibGtzeik+MEwpIHsKKwkJdWxvbmcgbWIsIG1iX3F1b3QsIG1iX3JlbSwgZ2IsIGdiX3F1b3QsIGdiX3JlbTsKKwkJbGJhaW50X3QgbGJhOworCisJCWxiYSA9IGRldl9kZXNjLT5sYmE7CisKKwkJbGJhNTEyID0gKGxiYSAqIChkZXZfZGVzYy0+Ymxrc3ovNTEyKSk7CisJCW1iID0gKDEwICogbGJhNTEyKSAvIDIwNDg7CS8qIDIwNDggPSAoMTAyNCAqIDEwMjQpIC8gNTEyIE1CICovCisJCS8qIHJvdW5kIHRvIDEgZGlnaXQgKi8KKwkJbWJfcXVvdAk9IG1iIC8gMTA7CisJCW1iX3JlbQk9IG1iIC0gKDEwICogbWJfcXVvdCk7CisKKwkJZ2IgPSBtYiAvIDEwMjQ7CisJCWdiX3F1b3QJPSBnYiAvIDEwOworCQlnYl9yZW0JPSBnYiAtICgxMCAqIGdiX3F1b3QpOworI2lmZGVmIENPTkZJR19MQkE0OAorCQlpZiAoZGV2X2Rlc2MtPmxiYTQ4KQorCQkJcHJpbnRmICgiICAgICAgICAgICAgU3VwcG9ydHMgNDgtYml0IGFkZHJlc3NpbmdcbiIpOworI2VuZGlmCisjaWYgZGVmaW5lZChDRkdfNjRCSVRfTEJBKSAmJiBkZWZpbmVkKENGR182NEJJVF9WU1BSSU5URikKKwkJcHJpbnRmICgiICAgICAgICAgICAgQ2FwYWNpdHk6ICVsZC4lbGQgTUIgPSAlbGQuJWxkIEdCICglcWQgeCAlbGQpXG4iLAorCQkJbWJfcXVvdCwgbWJfcmVtLAorCQkJZ2JfcXVvdCwgZ2JfcmVtLAorCQkJbGJhLAorCQkJZGV2X2Rlc2MtPmJsa3N6KTsKKyNlbHNlCisJCXByaW50ZiAoIiAgICAgICAgICAgIENhcGFjaXR5OiAlbGQuJWxkIE1CID0gJWxkLiVsZCBHQiAoJWxkIHggJWxkKVxuIiwKKwkJCW1iX3F1b3QsIG1iX3JlbSwKKwkJCWdiX3F1b3QsIGdiX3JlbSwKKwkJCSh1bG9uZylsYmEsCisJCQlkZXZfZGVzYy0+Ymxrc3opOworI2VuZGlmCisJfSBlbHNlIHsKKwkJcHJpbnRmICgiICAgICAgICAgICAgQ2FwYWNpdHk6IG5vdCBhdmFpbGFibGVcbiIpOworCX0KK30KKyNlbmRpZgkvKiBDRkdfQ01EX0lERSB8fCBDRkdfQ01EX1NDU0kgfHwgQ0ZHX0NNRF9VU0IgfHwgQ09ORklHX01NQyAqLworCisjaWYgKChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKQl8fCBcCisgICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikJfHwgXAorICAgICAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NTUMpCXx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfU1lTVEVNQUNFKSAgICAgICAgICApCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQUNfUEFSVElUSU9OKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfRE9TX1BBUlRJVElPTikgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0lTT19QQVJUSVRJT04pIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19BTUlHQV9QQVJUSVRJT04pCisKK3ZvaWQgaW5pdF9wYXJ0IChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MpCit7CisjaWZkZWYgQ09ORklHX0lTT19QQVJUSVRJT04KKwlpZiAodGVzdF9wYXJ0X2lzbyhkZXZfZGVzYykgPT0gMCkgeworCQlkZXZfZGVzYy0+cGFydF90eXBlID0gUEFSVF9UWVBFX0lTTzsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKwlpZiAodGVzdF9wYXJ0X21hYyhkZXZfZGVzYykgPT0gMCkgeworCQlkZXZfZGVzYy0+cGFydF90eXBlID0gUEFSVF9UWVBFX01BQzsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RPU19QQVJUSVRJT04KKwlpZiAodGVzdF9wYXJ0X2RvcyhkZXZfZGVzYykgPT0gMCkgeworCQlkZXZfZGVzYy0+cGFydF90eXBlID0gUEFSVF9UWVBFX0RPUzsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorCWlmICh0ZXN0X3BhcnRfYW1pZ2EoZGV2X2Rlc2MpID09IDApIHsKKwkgICAgZGV2X2Rlc2MtPnBhcnRfdHlwZSA9IFBBUlRfVFlQRV9BTUlHQTsKKwkgICAgcmV0dXJuOworCX0KKyNlbmRpZgorfQorCisKK2ludCBnZXRfcGFydGl0aW9uX2luZm8gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbykKK3sKKwkJc3dpdGNoIChkZXZfZGVzYy0+cGFydF90eXBlKSB7CisjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9NQUM6CisJCWlmIChnZXRfcGFydGl0aW9uX2luZm9fbWFjKGRldl9kZXNjLHBhcnQsaW5mbykgPT0gMCkgeworCQkJUFJJTlRGICgiIyMgVmFsaWQgTUFDIHBhcnRpdGlvbiBmb3VuZCAjI1xuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0RPUzoKKwkJaWYgKGdldF9wYXJ0aXRpb25faW5mb19kb3MoZGV2X2Rlc2MscGFydCxpbmZvKSA9PSAwKSB7CisJCQlQUklOVEYgKCIjIyBWYWxpZCBET1MgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfSVNPOgorCQlpZiAoZ2V0X3BhcnRpdGlvbl9pbmZvX2lzbyhkZXZfZGVzYyxwYXJ0LGluZm8pID09IDApIHsKKwkJCVBSSU5URiAoIiMjIFZhbGlkIElTTyBib290IHBhcnRpdGlvbiBmb3VuZCAjI1xuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJY2FzZSBQQVJUX1RZUEVfQU1JR0E6CisJICAgIGlmIChnZXRfcGFydGl0aW9uX2luZm9fYW1pZ2EoZGV2X2Rlc2MsIHBhcnQsIGluZm8pID09IDApCisJICAgIHsKKwkJUFJJTlRGICgiIyMgVmFsaWQgQW1pZ2EgcGFydGl0aW9uIGZvdW5kICMjXG4iKTsKKwkJcmV0dXJuICgwKTsKKwkgICAgfQorCSAgICBicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGFydF9oZWFkZXIgKGNvbnN0IGNoYXIgKnR5cGUsIGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYykKK3sKKwlzd2l0Y2ggKGRldl9kZXNjLT5pZl90eXBlKSB7CisJCWNhc2UgSUZfVFlQRV9JREU6ICAJcHJpbnRmICgiSURFIik7CisJCQkJCWJyZWFrOworCQljYXNlIElGX1RZUEVfU0NTSTogCXByaW50ZiAoIlNDU0kiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9BVEFQSToJcHJpbnRmICgiQVRBUEkiKTsKKwkJCQkJYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9VU0I6CXByaW50ZiAoIlVTQiIpOworCQkJCQlicmVhazsKKwkJY2FzZSBJRl9UWVBFX0RPQzoJcHJpbnRmICgiRE9DIik7CisJCQkJCWJyZWFrOworCQlkZWZhdWx0OiAJCXByaW50ZiAoIlVOS05PV04iKTsKKwkJCQkJYnJlYWs7CisJfQorCXByaW50ZiAoIiBkZXZpY2UgJWQgIC0tICAgUGFydGl0aW9uIFR5cGU6ICVzXG5cbiIsCisJCQlkZXZfZGVzYy0+ZGV2LCB0eXBlKTsKK30KKwordm9pZCBwcmludF9wYXJ0IChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MpCit7CisKKwkJc3dpdGNoIChkZXZfZGVzYy0+cGFydF90eXBlKSB7CisjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9NQUM6CisJCVBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIHZhbGlkIE1BQyBwYXJ0aXRpb24gIyNcbiIpOworCQlwcmludF9wYXJ0X2hlYWRlciAoIk1BQyIsIGRldl9kZXNjKTsKKwkJcHJpbnRfcGFydF9tYWMgKGRldl9kZXNjKTsKKwkJcmV0dXJuOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RPU19QQVJUSVRJT04KKwljYXNlIFBBUlRfVFlQRV9ET1M6CisJCVBSSU5URiAoIiMjIFRlc3RpbmcgZm9yIHZhbGlkIERPUyBwYXJ0aXRpb24gIyNcbiIpOworCQlwcmludF9wYXJ0X2hlYWRlciAoIkRPUyIsIGRldl9kZXNjKTsKKwkJcHJpbnRfcGFydF9kb3MgKGRldl9kZXNjKTsKKwkJcmV0dXJuOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVNPX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0lTTzoKKwkJUFJJTlRGICgiIyMgVGVzdGluZyBmb3IgdmFsaWQgSVNPIEJvb3QgcGFydGl0aW9uICMjXG4iKTsKKwkJcHJpbnRfcGFydF9oZWFkZXIgKCJJU08iLCBkZXZfZGVzYyk7CisJCXByaW50X3BhcnRfaXNvIChkZXZfZGVzYyk7CisJCXJldHVybjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorCWNhc2UgUEFSVF9UWVBFX0FNSUdBOgorCSAgICBQUklOVEYgKCIjIyBUZXN0aW5nIGZvciBhIHZhbGlkIEFtaWdhIHBhcnRpdGlvbiAjI1xuIik7CisJICAgIHByaW50X3BhcnRfaGVhZGVyICgiQU1JR0EiLCBkZXZfZGVzYyk7CisJICAgIHByaW50X3BhcnRfYW1pZ2EgKGRldl9kZXNjKTsKKwkgICAgcmV0dXJuOworI2VuZGlmCisJfQorfQorCisKKyNlbHNlCS8qIG5laXRoZXIgTUFDIG5vciBET1Mgbm9yIElTTyBwYXJ0aXRpb24gY29uZmlndXJlZCAqLworIyBlcnJvciBuZWl0aGVyIENPTkZJR19NQUNfUEFSVElUSU9OIG5vciBDT05GSUdfRE9TX1BBUlRJVElPTiBub3IgQ09ORklHX0lTT19QQVJUSVRJT04gY29uZmlndXJlZCEKKyNlbmRpZgorCisjZW5kaWYJLyogKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCBDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1NDU0kpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODExMjU3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDk0IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwNgorIyBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorIworIyBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworIyBwcm9qZWN0LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisjIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK2luY2x1ZGUgJChUT1BESVIpL2NvbmZpZy5taworCitMSUIJOj0gJChvYmopbGlibmFuZC5hCisKK2lmZXEgKCQoQk9BUkQpLCBvbWFwMzQzMHNkcCkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDM0MzBsYWJyYWRvcikKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDNldm0pCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIGFtMzUxN2V2bSkKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDI0MjBoNCkKK0NPQkpTLXkJKz0gazlrMTIxNi5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgb21hcDI0MzBzZHApCitDT0JKUy15CSs9IGs5azEyMTYubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIG9tYXAxNzEwaDMpCitDT0JKUy15CSs9IGs5ZjU2MTYubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIGRpYW1vbmQpCitDT0JKUy15CSs9IGs5ZjFnMDhyMGEubworZW5kaWYKKworaWZlcSAoJChCT0FSRCksIGRpYW1vbmQtdXNiLWxvYWRlcikKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCitpZmVxICgkKEJPQVJEKSwgajQ5KQorQ09CSlMteQkrPSBrOWYxZzA4cjBhLm8KK2VuZGlmCisKK2lmZXEgKCQoQk9BUkQpLCBqNDktdXNiLWxvYWRlcikKK0NPQkpTLXkJKz0gazlmMWcwOHIwYS5vCitlbmRpZgorCisjIyBEaXNhYmxlZCBmb3Igbm93OgorIyMJICBjczg5MDAubyBjdDY5MDAwLm8gZGF0YWZsYXNoLm8gZGMyMTE0eC5vIGRzMTcyMi5vIFwKKyMjCSAgbGFuOTFjOTYubyBtd19lZXByb20ubyBuYXRzZW1pLm8gXAorIyMJICBzbWM5MTExMS5vIHNtaUx5bnhFTS5vIHNwaV9lZXByb20ubyBzeW01M2M4eHgubyBcCisjIworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWYxZzA4cjBhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlmMWcwOHIwYS5jCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBKaWFuIFpoYW5nIDxqemhhbmdAdGkuY29tPgorICoKKyAqICBTYW1zdW5nIEs5RjFHMDhSMEFRMEMgTkFORCBjaGlwIGRyaXZlciBmb3IgYW4gT01BUDI0MjAgYm9hcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvc3lzX2luZm8uaD4KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfSzlGMUcwOFIwQSkgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykgfHwJXAorICAgIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCisjZGVmaW5lIEs5RjFHMDhSMEFfTUZSCQkweGVjICAvKiBTYW1zdW5nICovCisjZGVmaW5lIEs5RjFHMDhSMEFfSUQJCTB4YTEgIC8qIHBhcnQgIyAqLworCisjZGVmaW5lIFMzNE1TMDFHMV9NRlIJCTB4MDEgIC8qIFNwYW5zaW9uICovCisjZGVmaW5lIFMzNE1TMDFHMV9JRAkJMHhiYSAgLyogcGFydCAjIC0gMTZiaXQsIDJHQiAqLworCisvKiBTaW5jZSBNaWNyb24gYW5kIFNhbXN1bmcgcGFydHMgYXJlIHNpbWlsYXIgaW4gZ2VvbWV0cnkgYW5kIGJ1cyB3aWR0aAorICogd2UgY2FuIHVzZSB0aGUgc2FtZSBkcml2ZXIuIE5lZWQgdG8gcmV2aXNpdCB0byBtYWtlIHRoaXMgZmlsZSBpbmRlcGVuZGVudAorICogb2YgcGFydC9tYW51ZmFjdHVyZXIKKyAqLworI2RlZmluZSBNVDI5RjFHX01GUgkJMHgyYyAgLyogTWljcm9uICovCisjZGVmaW5lIE1UMjlGMUdfSUQJCTB4YTEgIC8qIHg4LCAxR2lCICovCisjZGVmaW5lIE1UMjlGMkdfSUQJCTB4YmEgIC8qIHgxNiwgMkdpQiAqLworCisjZGVmaW5lIEhZTklYNEdpQl9NRlIJCTB4QUQgIC8qIEh5bml4ICovCisjZGVmaW5lIEhZTklYNEdpQl9JRAkJMHhCQyAgLyogeDE2LCA0R2lCICovCisKKyNkZWZpbmUgQUREUl9DT0xVTU4JCTEKKyNkZWZpbmUgQUREUl9QQUdFCQkyCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJKEFERFJfQ09MVU1OIHwgQUREUl9QQUdFKQorCisjZGVmaW5lIEFERFJfT09CCQkoMHg0IHwgQUREUl9DT0xVTU5fUEFHRSkKKworI2RlZmluZSBQQUdFX1NJWkUJCTIwNDgKKyNkZWZpbmUgT09CX1NJWkUJCTY0CisjZGVmaW5lIE1BWF9OVU1fUEFHRVMJCTY0CisKKyNkZWZpbmUgRUNDX0NIRUNLX0VOQUJMRQorCisjaWYgQ0ZHX05BTkRfRUNDXzFCSVQKKyNkZWZpbmUgRUNDX1NJWkUJCTI0CisjZGVmaW5lIEVDQ19TVEVQUwkJMworI2RlZmluZSBvbWFwX2VuYWJsZV9od2VjYworI2RlZmluZSBvbWFwX2NvcnJlY3RfZGF0YQorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MKKyNlbGlmIENGR19OQU5EX0VDQ180QklUCisjZGVmaW5lIEVDQ19TSVpFCQkyOCAKKyNkZWZpbmUgRUNDX1NURVBTCQkyOCAKKworZXh0ZXJuIGVuYWJsZV9od2VjY19iY2g0KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoNCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDQKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoNAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCisjZGVmaW5lIEVDQ19TSVpFCQk1MgorI2RlZmluZSBFQ0NfU1RFUFMJCTUyIAorCitleHRlcm4gdm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g4KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKTsKK2V4dGVybiBpbnQgb21hcF9jb3JyZWN0X2RhdGFfYmNoOCh1aW50OF90ICpkYXQsIHVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYyk7CitleHRlcm4gaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGNvbnN0IHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqZWNjX2NvZGUpOworCisjZGVmaW5lIG9tYXBfZW5hYmxlX2h3ZWNjCW9tYXBfZW5hYmxlX2h3ZWNjX2JjaDgKKyNkZWZpbmUgb21hcF9jb3JyZWN0X2RhdGEJb21hcF9jb3JyZWN0X2RhdGFfYmNoOAorI2RlZmluZSBvbWFwX2NhbGN1bGF0ZV9lY2MJb21hcF9jYWxjdWxhdGVfZWNjX2JjaDgKKyNlbHNlCisjZXJyb3IgIk5vbmUgb2YgQ0ZHX05BTkRfRUNDX3sxLDQsOH1CSVQgaXMgZGVmaW5lZC4iCisjZW5kaWYgLyogQ0ZHX05BTkRfRUNDXzFCSVQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJvdXRpbmU6IGRlbGF5CisgKiBEZXNjcmlwdGlvbjogc3Bpbm5pbmcgZGVsYXkgdG8gdXNlIGJlZm9yZSB1ZGVsYXkgd29ya3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkgKHVuc2lnbmVkIGxvbmcgbG9vcHMpCit7CisJX19hc21fXyB2b2xhdGlsZSAoIjE6XG4iCisJCQkJCSAgInN1YnMgJTAsICUwLCAjMVxuIgorCQkJCQkgICJibmUgMWIiOiI9ciIgKGxvb3BzKToiMCIgKGxvb3BzKSk7Cit9CisKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcik7CitzdGF0aWMgaW50IG5hbmRfcmVhZF9vb2IodV9jaGFyICogYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworCisjaWZkZWYgQ0ZHX05BTkRfRUNDXzFCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKwkJNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LAorCQk1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjN9OworI2VsaWYgQ0ZHX05BTkRfRUNDXzRCSVQKK3N0YXRpYyB1X2NoYXIgZWNjX3Bvc1tdID0KKwkJezM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCAKKwkJNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIAorCQk1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgCisJCTU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzfTsKKyNlbGlmIENGR19OQU5EX0VDQ184QklUCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9CisJCXsxMiwgMTMsIDE0LAorCQkxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkJMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisJCTI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LAorCQkzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgCisJCTQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCAKKwkJNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIAorCQk1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2M307CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hpcHNpemUgPSAoMjU2IDw8IDIwKTsKKworI2lmZGVmIE5BTkRfMTZCSVQKK3N0YXRpYyBpbnQgYnVzX3dpZHRoID0gMTY7CisjZWxzZQorc3RhdGljIGludCBidXNfd2lkdGggPSA4OworI2VuZGlmCisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisKKyAJV1JJVEVfTkFORF9DT01NQU5EKGNvbW1hbmQsIE5BTkRfQUREUik7CisgCU5BTkRfQ1RMX0NMUkNMRShOQU5EX0FERFIpOworCisgIAlpZihjb21tYW5kID09IE5BTkRfQ01EX1JFU0VUKXsKKwkJdW5zaWduZWQgY2hhciByZXRfdmFsOworCQlOYW5EX0NvbW1hbmQoTkFORF9DTURfU1RBVFVTKTsKKwkJZG97CisJCQlyZXRfdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7Lyogd2FpdCB0aWxsIHJlYWR5ICovCisgIAkJfSB3aGlsZSgocmV0X3ZhbCAmIDB4NDApICE9IDB4NDApOworIAl9CisKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3ModW5zaWduZWQgaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKwl1Y2hhciB1OworCisgCU5BTkRfQ1RMX1NFVEFMRShOQU5EX0FERFIpOworCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UKKwkJCQl8fCBudW1ieXRlcyA9PSBBRERSX09PQikKKwl7CisJCXVzaG9ydCBjb2wgPSBvZnM7CisKKwkJdSA9IGNvbCAgJiAweGZmOworCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKworCQl1ID0gKGNvbCA+PiA4KSAmIDB4MDc7CisJCWlmIChudW1ieXRlcyA9PSBBRERSX09PQikKKwkJCXUgPSB1IHwgKChidXNfd2lkdGggPT0gMTYpID8gKDEgPDwgMikgOiAoMSA8PCAzKSk7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCX0KKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRQorCQkJCXx8IG51bWJ5dGVzID09IEFERFJfT09CKQorCXsKKwkJdSA9IChvZnMgPj4gMTEpICYgMHhmZjsKKwkJV1JJVEVfTkFORF9BRERSRVNTKHUsIE5BTkRfQUREUik7CisJCXUgPSAob2ZzID4+IDE5KSAmIDB4ZmY7CisJCVdSSVRFX05BTkRfQUREUkVTUyh1LCBOQU5EX0FERFIpOworCisJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGRldmljZXMgPiAxMjhNaUIgKi8KKwkJaWYgKGNoaXBzaXplID4gKDEyOCA8PCAyMCkpIHsKKwkJCXUgPSAob2ZzID4+IDI3KSAmIDB4ZmY7CisJCQlXUklURV9OQU5EX0FERFJFU1ModSwgTkFORF9BRERSKTsKKwkJfQorCX0KKworIAlOQU5EX0NUTF9DTFJBTEUoTkFORF9BRERSKTsKKworIAlOQU5EX1dBSVRfUkVBRFkoKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBjaGlwIG1mciBhbmQgaWQKKyAqIHJldHVybiAwIGlmIHRoZXkgbWF0Y2ggYm9hcmQgY29uZmlnCisgKiByZXR1cm4gMSBpZiBub3QKKyAqLworaW50IG5hbmRfY2hpcCgpCit7CisJY29uc3QgaW50IHN1cHBvcnRlZCA9IDA7CisJaW50IG1mciwgaWQ7CisKKyAJTkFORF9FTkFCTEVfQ0UoKTsKKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFU0VUKSkgeworIAkJcHJpbnRmKCJFcnI6IFJFU0VUXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCX0KKworIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAoIXN1cHBvcnRlZCk7CisgCX0KKworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlkZWJ1ZygiTkFORDogJXg6JXhcbiIsIG1mciwgaWQpOworCisJTkFORF9ESVNBQkxFX0NFKCk7CisKKwlzd2l0Y2ggKG1mcikgeworCisJY2FzZSBLOUYxRzA4UjBBX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSzlGMUcwOFIwQV9JRDoJCXJldHVybiAoc3VwcG9ydGVkKTsKKwkJZGVmYXVsdDoJCQkJcmV0dXJuICghc3VwcG9ydGVkKTsKKworCQl9CisJCWJyZWFrOworCisJY2FzZSBNVDI5RjFHX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgTVQyOUYxR19JRDoJCQorCQljYXNlIE1UMjlGMkdfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWNhc2UgSFlOSVg0R2lCX01GUjoKKwkJc3dpdGNoIChpZCkgeworCisJCWNhc2UgSFlOSVg0R2lCX0lEOgkJcmV0dXJuIChzdXBwb3J0ZWQpOworCQlkZWZhdWx0OgkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJCX0KKwkJYnJlYWs7CisJY2FzZSBTMzRNUzAxRzFfTUZSOgorCQlzd2l0Y2ggKGlkKSB7CisKKwkJY2FzZSBTMzRNUzAxRzFfSUQ6CQlyZXR1cm4gKHN1cHBvcnRlZCk7CisJCWRlZmF1bHQ6CQkJCXJldHVybiAoIXN1cHBvcnRlZCk7CisKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CQkJCQlyZXR1cm4gKCFzdXBwb3J0ZWQpOworCisJfQorCisJcmV0dXJuICghc3VwcG9ydGVkKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLworaW50IG5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpCit7CisJaW50IGksIG9mZnNldCA9IDA7CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJdTE2IG9vYl9idWZbT09CX1NJWkUgPj4gMV07CisKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggd29yZCBpbiBzcGFyZSBhcmVhIG5lZWRzIGJlIDB4ZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYigodW5zaWduZWQgY2hhciAqKW9vYl9idWYsIGJsb2NrX2FkZHIpCisJCXx8IChvb2JfYnVmWzBdICYgMHhmZikgIT0gMHhmZikgeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworCQlyZXR1cm4gTkFORF9SRUFEX1NLSVBQRURfQkFEX0JMT0NLOyAgICAvKiBza2lwIGJhZCBibG9jayAqLworCX0KKyNlbmRpZgorCS8qIHJlYWQgdGhlIGJsb2NrIHBhZ2UgYnkgcGFnZSovCisJZm9yIChpPTA7IGk8TUFYX05VTV9QQUdFUzsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgaW50IGNvdW50OworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJLyogaW5jcmVhc2VkIHNpemUgb2YgZWNjX2NvZGUgYW5kIGVjY19jYWxjIHRvIG1hdGNoIHRoZSBPT0Igc2l6ZSwgCisJICAgYXMgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCisJdV9jaGFyIGVjY19jb2RlW09PQl9TSVpFXTsKKwl1X2NoYXIgZWNjX2NhbGNbT09CX1NJWkVdOworCXVfY2hhciBvb2JfYnVmW09PQl9TSVpFXTsKKyNlbmRpZgorCXUxNiB2YWw7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCisJTkFORF9FTkFCTEVfQ0UoKTsKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKworCW9tYXBfZW5hYmxlX2h3ZWNjKGJ1c193aWR0aCwgMCk7CisKKwkvKiByZWFkIHRoZSBwYWdlICovCisJbGVuID0gKGJ1c193aWR0aCA9PSAxNikgPyBQQUdFX1NJWkUgPj4gMSA6IFBBR0VfU0laRTsKKwlwID0gKHUxNiAqKWJ1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAgIAl9CisKKyNpZmRlZiBFQ0NfQ0hFQ0tfRU5BQkxFCisJb21hcF9jYWxjdWxhdGVfZWNjKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKworCS8qIHJlYWQgdGhlIE9PQiBhcmVhICovCisJcCA9ICh1MTYgKilvb2JfYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspeworCQkqcCsrID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCWRlbGF5KDEwKTsKKyAJfQorCWNvdW50ID0gMDsKKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworCS8qIE5lZWQgdG8gZW5hYmxlIEhXRUNDIGZvciBSRUFESU5HICovCisKKyAJLyogUGljayB0aGUgRUNDIGJ5dGVzIG91dCBvZiB0aGUgb29iIGRhdGEgKi8KKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgRUNDX1NJWkU7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWZvcihjb3VudCA9IDA7IGNvdW50IDwgRUNDX1NJWkU7IGNvdW50ICs9IEVDQ19TVEVQUykgeworI2lmIENGR19OQU5EX0VDQ18xQklUCisgCQluYW5kX2NhbGN1bGF0ZV9lY2MgKGJ1ZiwgJmVjY19jYWxjWzBdKTsKKwkJaWYgKG5hbmRfY29ycmVjdF9kYXRhIChidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbHNlCisJCWlmIChvbWFwX2NvcnJlY3RfZGF0YShidWYsICZlY2NfY29kZVtjb3VudF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyNlbmRpZgorIAkJCXByaW50ZiAoIkVDQyBGYWlsZWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlX2FkZHIpOworCQkJZm9yICh2YWw9MDsgdmFsIDwyNTY7IHZhbCsrKQorCQkJCXByaW50ZigiJXggIiwgYnVmW3ZhbF0pOworCQkJcHJpbnRmKCJcbiIpOworICAJCQlyZXR1cm4gMTsKKyAJCX0KKwkJYnVmICs9IDI1NjsKKwkJcGFnZV9hZGRyICs9IDI1NjsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogcmVhZCBmcm9tIHRoZSAxNiBieXRlcyBvZiBvb2IgZGF0YSB0aGF0IGNvcnJlc3BvbmQgdG8gYSA1MTIgLyAyMDQ4IGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJaW50IGNudHI7CisJaW50IGxlbjsKKworI2lmZGVmIE5BTkRfMTZCSVQKKwl1MTYgKnA7CisjZWxzZQorCXVfY2hhciAqcDsKKyNlbmRpZgorCXAgPSAodTE2ICopYnVmOworICAgICAgICBsZW4gPSAoYnVzX3dpZHRoID09IDE2KSA/IE9PQl9TSVpFID4+IDEgOiBPT0JfU0laRTsKKworICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQUQwKTsKKyAJTmFuRF9BZGRyZXNzKEFERFJfT09CLCBwYWdlX2FkZHIpOworCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFEU1RBUlQpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJLyogQSBkZWxheSBzZWVtcyB0byBiZSBoZWxwaW5nIGhlcmUuIG5lZWRzIG1vcmUgaW52ZXN0aWdhdGlvbiAqLworCWRlbGF5KDEwMDAwKTsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgbGVuOyBjbnRyKyspCisJCSpwKysgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX0s5RjFHMDhSMEEpIHx8CisJCSogZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSB8fAorCQkqIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorCQkqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5ZjU2MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGIxNDJiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvbmFuZC9rOWY1NjE2LmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqIEppYW4gWmhhbmcgPGp6aGFuZ0B0aS5jb20+CisgKgorICogIFNhbXN1bmcgSzlGNTYxNlEwQyBOQU5EIGNoaXAgZHJpdmVyIGZvciBhbiBPTUFQMTZ4eCBib2FyZAorICogCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyB1LWJvb3QgZmlsZToKKyAqCWNvbW1vbi9jbWRfbmFuZC5jCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjaWZkZWYgQ0ZHX05BTkRfSzlGNTYxNgorCisjZGVmaW5lIEs5RjU2MTZfTUZSCQkweGVjCisjZGVmaW5lIEs5RjU2MTZfSUQJCTB4NDUKKworI2RlZmluZSBBRERSX0NPTFVNTgkJMSAgICAgICAgICAKKyNkZWZpbmUgQUREUl9QQUdFCQkyICAgICAgICAgICAgIAorI2RlZmluZSBBRERSX0NPTFVNTl9QQUdFCTMKKworI2RlZmluZSBQQUdFX1NJWkUJCTUxMgorCitzdGF0aWMgaW50IG5hbmRfcmVhZF9wYWdlKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpOworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqIGJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKKworLyogSkZGUzIgNTEyLWJ5dGUtcGFnZSBFQ0MgbGF5b3V0ICovCitzdGF0aWMgdV9jaGFyIGVjY19wb3NbXSA9IHswLDEsMiwzLDYsN307CitzdGF0aWMgdV9jaGFyIGVjY3ZhbGlkX3BvcyA9IDQ7CisKKy8qIE5hbkRfQ29tbWFuZDogU2VuZCBhIGZsYXNoIGNvbW1hbmQgdG8gdGhlIGZsYXNoIGNoaXAgKi8KK3N0YXRpYyBpbnQgTmFuRF9Db21tYW5kKHVuc2lnbmVkIGNoYXIgY29tbWFuZCkKK3sKKyAJTkFORF9DVExfU0VUQ0xFKE5BTkRfQUREUik7CisgCVdSSVRFX05BTkRfQ09NTUFORChjb21tYW5kLCBOQU5EX0FERFIpOworIAlOQU5EX0NUTF9DTFJDTEUoTkFORF9BRERSKTsKKworICAJaWYoY29tbWFuZCA9PSBOQU5EX0NNRF9SRVNFVCl7CisJCXVuc2lnbmVkIGNoYXIgcmV0X3ZhbDsKKwkJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1NUQVRVUyk7CisJCWRveworCQkJcmV0X3ZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOy8qIHdhaXQgdGlsbCByZWFkeSAqLworICAJCX0gd2hpbGUoKHJldF92YWwgJiAweDQwKSAhPSAweDQwKTsKKyAJfQorIAkKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE5hbkRfQWRkcmVzczogU2V0IHRoZSBjdXJyZW50IGFkZHJlc3MgZm9yIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQWRkcmVzcyhpbnQgbnVtYnl0ZXMsIHVuc2lnbmVkIGxvbmcgb2ZzKQoreworIAlpbnQgaTsKKworIAlOQU5EX0NUTF9TRVRBTEUoTkFORF9BRERSKTsKKyAKKwlpZiAobnVtYnl0ZXMgPT0gQUREUl9DT0xVTU4gfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJV1JJVEVfTkFORF9BRERSRVNTKG9mcywgTkFORF9BRERSKTsKKworCW9mcyA9IG9mcyA+PiA4OworCisJaWYgKG51bWJ5dGVzID09IEFERFJfUEFHRSB8fCBudW1ieXRlcyA9PSBBRERSX0NPTFVNTl9QQUdFKQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrLCBvZnMgPSBvZnMgPj4gOCkKKwkJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKyAJTkFORF9DVExfQ0xSQUxFKE5BTkRfQUREUik7CisKKyAJTkFORF9XQUlUX1JFQURZKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgY2hpcCBtZnIgYW5kIGlkCisgKiByZXR1cm4gMCBpZiB0aGV5IG1hdGNoIGJvYXJkIGNvbmZpZworICogcmV0dXJuIDEgaWYgbm90CisgKi8KK2ludCBuYW5kX2NoaXAoKQoreworCWludCBtZnIsIGlkOworCisgCU5BTkRfRU5BQkxFX0NFKCk7CisKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRVNFVCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRVNFVFxuIik7CisgCQlOQU5EX0RJU0FCTEVfQ0UoKTsgICAKKwkJcmV0dXJuIDE7CisJfQorIAorIAlpZiAoTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURJRCkpIHsKKyAJCXByaW50ZigiRXJyOiBSRUFESURcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7CisJCXJldHVybiAxOworIAl9CisgCisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTiwgMCk7CisKKyAJbWZyID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJaWQgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKworCU5BTkRfRElTQUJMRV9DRSgpOworCisgIAlyZXR1cm4gKG1mciAhPSBLOUY1NjE2X01GUiB8fCBpZCAhPSBLOUY1NjE2X0lEKTsKK30KKworLyogcmVhZCBhIGJsb2NrIGRhdGEgdG8gYnVmCisgKiByZXR1cm4gMSBpZiB0aGUgYmxvY2sgaXMgYmFkIG9yIEVDQyBlcnJvciBjYW4ndCBiZSBjb3JyZWN0ZWQgZm9yIGFueSBwYWdlCisgKiByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKK2ludCBuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9ja19hZGRyKQoreworCWludCBpLCBvZmZzZXQgPSAwOworCXVjaGFyIG9vYl9idWZbMTZdOworIAkKKwkvKiBjaGVjayBiYWQgYmxvY2sgKi8KKwkvKiAwdGggYW5kIDV0aCB3b3JkcyBuZWVkIGJlIDB4ZmZmZiAqLworCWlmIChuYW5kX3JlYWRfb29iKG9vYl9idWYsIGJsb2NrX2FkZHIpIHx8CisvLwkJb29iX2J1ZlswXSAhPSAweGZmIHx8IG9vYl9idWZbMV0gIT0gMHhmZiB8fAorLy8JCW9vYl9idWZbMTBdICE9IDB4ZmYgfHwgb29iX2J1ZlsxMV0gIT0gMHhmZiApeworCQlvb2JfYnVmWzVdICE9IDB4ZmYpeworCQlwcmludGYoIlNraXBwZWQgYmFkIGJsb2NrIGF0IDB4JXhcbiIsIGJsb2NrX2FkZHIpOworIAkJcmV0dXJuIE5BTkRfUkVBRF9TS0lQUEVEX0JBRF9CTE9DSzsgICAgLyogc2tpcCBiYWQgYmxvY2sgKi8KKwl9CisKKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAoaT0wOyBpPDMyOyBpKyspeworCQlpZiAobmFuZF9yZWFkX3BhZ2UoYnVmK29mZnNldCwgYmxvY2tfYWRkciArIG9mZnNldCkpCisJCQlyZXR1cm4gTkFORF9SRUFEX0VDQ19GQUlMVVJFOworCQlvZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBOQU5EX1JFQURfU1VDQ0VTUzsKK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCisJTkFORF9XQUlUX1JFQURZKCk7CisgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKworCXAgPSBvb2JfYnVmOworCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworIAkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisJCSpwKysgPSB2YWwgJiAweGZmOworCQkqcCsrID0gdmFsID4+IDg7CisgCX0KKyAJTkFORF9ESVNBQkxFX0NFKCk7ICAvKiBzZXQgcGluIGhpZ2ggKi8KKworIAkvKiBQaWNrIHRoZSBFQ0MgYnl0ZXMgb3V0IG9mIHRoZSBvb2IgZGF0YSAqLworCWZvciAoY250ciA9IDA7IGNudHIgPCA2OyBjbnRyKyspCisJCWVjY19jb2RlW2NudHJdID0gIG9vYl9idWZbZWNjX3Bvc1tjbnRyXV07CisKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgZnJvbSB0aGUgMTYgYnl0ZXMgb2Ygb29iIGRhdGEgdGhhdCBjb3JyZXNwb25kIHRvIGEgNTEyIGJ5dGUgcGFnZS4KKyAqLworc3RhdGljIGludCBuYW5kX3JlYWRfb29iKHVfY2hhciAqYnVmLCB1bG9uZyBwYWdlX2FkZHIpCit7CisJdTE2IHZhbDsKKwlpbnQgY250cjsKKyAgICAJCisgIAlOQU5EX0VOQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBsb3cgKi8KKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRE9PQik7CisgCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHI+PjEpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZm9yIChjbnRyID0gMDsgY250ciA8IDg7IGNudHIrKyl7CisJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqYnVmKysgPSB2YWwgJiAweGZmOworCQkqYnVmKysgPSB2YWwgPj4gODsKKyAgCX0KKworCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYyBiL3gtbG9hZGVyL2RyaXZlcnMvbXRkL25hbmQvazlrMTIxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTMwNWQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9kcml2ZXJzL210ZC9uYW5kL2s5azEyMTYuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNCBUZXhhcyBJbnN0cnVtZW50cworICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4KKyAqCisgKiAgU2Ftc3VuZyBLOUsxMjE2UTBDIE5BTkQgY2hpcCBkcml2ZXIgZm9yIGFuIE9NQVAyNDIwIGJvYXJkCisgKiAKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfTkFORF9LOUsxMjE2CisKKyNkZWZpbmUgSzlLMTIxNl9NRlIJCTB4ZWMKKyNkZWZpbmUgSzlLMTIxNl9JRAkJMHg0NgorCisjZGVmaW5lIEFERFJfQ09MVU1OCQkxICAgICAgICAgIAorI2RlZmluZSBBRERSX1BBR0UJCTIgICAgICAgICAgICAgCisjZGVmaW5lIEFERFJfQ09MVU1OX1BBR0UJMworCisjZGVmaW5lIFBBR0VfU0laRQkJNTEyCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUm91dGluZTogZGVsYXkKKyAqIERlc2NyaXB0aW9uOiBzcGlubmluZyBkZWxheSB0byB1c2UgYmVmb3JlIHVkZWxheSB3b3JrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSAodW5zaWduZWQgbG9uZyBsb29wcykKK3sKKwlfX2FzbV9fIHZvbGF0aWxlICgiMTpcbiIKKwkJCQkJICAic3VicyAlMCwgJTEsICMxXG4iCisJCQkJCSAgImJuZSAxYiI6Ij1yIiAobG9vcHMpOiIwIiAobG9vcHMpKTsKK30KKworc3RhdGljIGludCBuYW5kX3JlYWRfcGFnZSh1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKTsKK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKiBidWYsIHVsb25nIHBhZ2VfYWRkcik7CisKKy8qIEpGRlMyIDUxMi1ieXRlLXBhZ2UgRUNDIGxheW91dCAqLworc3RhdGljIHVfY2hhciBlY2NfcG9zW10gPSB7MCwxLDIsMyw2LDd9Oworc3RhdGljIHVfY2hhciBlY2N2YWxpZF9wb3MgPSA0OworCisvKiBOYW5EX0NvbW1hbmQ6IFNlbmQgYSBmbGFzaCBjb21tYW5kIHRvIHRoZSBmbGFzaCBjaGlwICovCitzdGF0aWMgaW50IE5hbkRfQ29tbWFuZCh1bnNpZ25lZCBjaGFyIGNvbW1hbmQpCit7CisgCU5BTkRfQ1RMX1NFVENMRShOQU5EX0FERFIpOworIAlXUklURV9OQU5EX0NPTU1BTkQoY29tbWFuZCwgTkFORF9BRERSKTsKKyAJTkFORF9DVExfQ0xSQ0xFKE5BTkRfQUREUik7CisKKyAgCWlmKGNvbW1hbmQgPT0gTkFORF9DTURfUkVTRVQpeworCQl1bnNpZ25lZCBjaGFyIHJldF92YWw7CisJCU5hbkRfQ29tbWFuZChOQU5EX0NNRF9TVEFUVVMpOworCQlkb3sKKwkJCXJldF92YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsvKiB3YWl0IHRpbGwgcmVhZHkgKi8KKyAgCQl9IHdoaWxlKChyZXRfdmFsICYgMHg0MCkgIT0gMHg0MCk7CisgCX0KKyAJCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiBOYW5EX0FkZHJlc3M6IFNldCB0aGUgY3VycmVudCBhZGRyZXNzIGZvciB0aGUgZmxhc2ggY2hpcCAqLworc3RhdGljIGludCBOYW5EX0FkZHJlc3MoaW50IG51bWJ5dGVzLCB1bnNpZ25lZCBsb25nIG9mcykKK3sKKyAJaW50IGk7CisKKyAJTkFORF9DVExfU0VUQUxFKE5BTkRfQUREUik7CisgCisJaWYgKG51bWJ5dGVzID09IEFERFJfQ09MVU1OIHx8IG51bWJ5dGVzID09IEFERFJfQ09MVU1OX1BBR0UpCisJCVdSSVRFX05BTkRfQUREUkVTUyhvZnMsIE5BTkRfQUREUik7CisKKwlvZnMgPSBvZnMgPj4gOTsKKworCWlmIChudW1ieXRlcyA9PSBBRERSX1BBR0UgfHwgbnVtYnl0ZXMgPT0gQUREUl9DT0xVTU5fUEFHRSkKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKywgb2ZzID0gb2ZzID4+IDgpCisJCQlXUklURV9OQU5EX0FERFJFU1Mob2ZzLCBOQU5EX0FERFIpOworCisgCU5BTkRfQ1RMX0NMUkFMRShOQU5EX0FERFIpOworCisgCU5BTkRfV0FJVF9SRUFEWSgpOworCXJldHVybiAwOworfQorCisvKiByZWFkIGNoaXAgbWZyIGFuZCBpZAorICogcmV0dXJuIDAgaWYgdGhleSBtYXRjaCBib2FyZCBjb25maWcKKyAqIHJldHVybiAxIGlmIG5vdAorICovCitpbnQgbmFuZF9jaGlwKCkKK3sKKwlpbnQgbWZyLCBpZDsKKworIAlOQU5EX0VOQUJMRV9DRSgpOworCisgCWlmIChOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVTRVQpKSB7CisgCQlwcmludGYoIkVycjogUkVTRVRcbiIpOworIAkJTkFORF9ESVNBQkxFX0NFKCk7ICAgCisJCXJldHVybiAxOworCX0KKyAKKyAJaWYgKE5hbkRfQ29tbWFuZChOQU5EX0NNRF9SRUFESUQpKSB7CisgCQlwcmludGYoIkVycjogUkVBRElEXG4iKTsKKyAJCU5BTkRfRElTQUJMRV9DRSgpOworCQlyZXR1cm4gMTsKKyAJfQorIAorIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU4sIDApOworCisgCW1mciA9IFJFQURfTkFORChOQU5EX0FERFIpOworCWlkID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisKKwlOQU5EX0RJU0FCTEVfQ0UoKTsKKworICAJcmV0dXJuIChtZnIgIT0gSzlLMTIxNl9NRlIgfHwgaWQgIT0gSzlLMTIxNl9JRCk7Cit9CisKKy8qIHJlYWQgYSBibG9jayBkYXRhIHRvIGJ1ZgorICogcmV0dXJuIDEgaWYgdGhlIGJsb2NrIGlzIGJhZCBvciBFQ0MgZXJyb3IgY2FuJ3QgYmUgY29ycmVjdGVkIGZvciBhbnkgcGFnZQorICogcmV0dXJuIDAgb24gc3VjZXNzCisgKi8gCitpbnQgbmFuZF9yZWFkX2Jsb2NrKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWxvbmcgYmxvY2tfYWRkcikKK3sKKwlpbnQgaSwgb2Zmc2V0ID0gMDsKKwl1Y2hhciBvb2JfYnVmWzE2XTsKKyAJCisJLyogY2hlY2sgYmFkIGJsb2NrICovCisJLyogMHRoIGFuZCA1dGggd29yZHMgbmVlZCBiZSAweGZmZmYgKi8KKwlpZiAobmFuZF9yZWFkX29vYihvb2JfYnVmLCBibG9ja19hZGRyKSB8fAorLy8JCW9vYl9idWZbMF0gIT0gMHhmZiB8fCBvb2JfYnVmWzFdICE9IDB4ZmYgfHwKKy8vCQlvb2JfYnVmWzEwXSAhPSAweGZmIHx8IG9vYl9idWZbMTFdICE9IDB4ZmYgKXsKKwkJb29iX2J1Zls1XSAhPSAweGZmKXsKKwkJcHJpbnRmKCJTa2lwcGVkIGJhZCBibG9jayBhdCAweCV4XG4iLCBibG9ja19hZGRyKTsKKyAJCXJldHVybiBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0s7ICAgIC8qIHNraXAgYmFkIGJsb2NrICovCisJfQorCisJLyogcmVhZCB0aGUgYmxvY2sgcGFnZSBieSBwYWdlKi8KKwlmb3IgKGk9MDsgaTwzMjsgaSsrKXsKKwkJaWYgKG5hbmRfcmVhZF9wYWdlKGJ1ZitvZmZzZXQsIGJsb2NrX2FkZHIgKyBvZmZzZXQpKQorCQkJcmV0dXJuIE5BTkRfUkVBRF9FQ0NfRkFJTFVSRTsKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4gTkFORF9SRUFEX1NVQ0NFU1M7Cit9CitzdGF0aWMgY291bnQgPSAwOworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX3BhZ2UodV9jaGFyICpidWYsIHVsb25nIHBhZ2VfYWRkcikKK3sKKyAJdV9jaGFyIGVjY19jb2RlWzZdOworCXVfY2hhciBlY2NfY2FsY1szXTsKKyAJdV9jaGFyIG9vYl9idWZbMTZdOworCXVfY2hhciAqcDsKKwl1MTYgdmFsOworCWludCBjbnRyOworCisJTkFORF9FTkFCTEVfQ0UoKTsgICAKKwlOYW5EX0NvbW1hbmQoTkFORF9DTURfUkVBRDApOworCU5hbkRfQWRkcmVzcyhBRERSX0NPTFVNTl9QQUdFLCBwYWdlX2FkZHIpOworCU5BTkRfV0FJVF9SRUFEWSgpOworCisJZGVsYXkoNTAwKTsgLyogd2UgZ28gdGhyb3VnaCBORkMgbmVlZCBhIGJpZ2dlciBkZWxheS4gMjAwIGlzIG5vdCBlbm91Z2ggKi8KKyAKKyAgCXAgPSBidWY7CisJZm9yIChjbnRyID0gMDsgY250ciA8IDI1NjsgY250cisrKXsKKwkJdmFsID0gUkVBRF9OQU5EKE5BTkRfQUREUik7CisgCQkqcCsrID0gdmFsICYgMHhmZjsKKyAJCSpwKysgPSB2YWwgPj4gODsKKyAgIAl9CisKKwlwID0gb29iX2J1ZjsKKwlmb3IgKGNudHIgPSAwOyBjbnRyIDwgODsgY250cisrKXsKKyAJCXZhbCA9IFJFQURfTkFORChOQU5EX0FERFIpOworCQkqcCsrID0gdmFsICYgMHhmZjsKKwkJKnArKyA9IHZhbCA+PiA4OworIAl9CisJY291bnQgPSAxOworIAlOQU5EX0RJU0FCTEVfQ0UoKTsgIC8qIHNldCBwaW4gaGlnaCAqLworCisgCS8qIFBpY2sgdGhlIEVDQyBieXRlcyBvdXQgb2YgdGhlIG9vYiBkYXRhICovCisJZm9yIChjbnRyID0gMDsgY250ciA8IDY7IGNudHIrKykKKwkJZWNjX2NvZGVbY250cl0gPSAgb29iX2J1ZltlY2NfcG9zW2NudHJdXTsKKworCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHgwZikgIT0gMHgwZikgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmLCAmZWNjX2NvZGVbMF0sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWxdKTsKKwkJCXByaW50ZigiXG4iKTsKKyAgCQkJcmV0dXJuIDE7CisgCQl9CisJfQorCQorCWlmICgob29iX2J1ZltlY2N2YWxpZF9wb3NdICYgMHhmMCkgIT0gMHhmMCkgeworIAkJbmFuZF9jYWxjdWxhdGVfZWNjIChidWYgKyAyNTYsICZlY2NfY2FsY1swXSk7CisJCWlmIChuYW5kX2NvcnJlY3RfZGF0YSAoYnVmICsgMjU2LCAmZWNjX2NvZGVbM10sICZlY2NfY2FsY1swXSkgPT0gLTEpIHsKKyAJCQlwcmludGYgKCJFQ0MgRmFpbGVkLCBwYWdlIDB4JTA4eFxuIiwgcGFnZV9hZGRyKzB4MTAwKTsKKwkJCWZvciAodmFsPTA7IHZhbCA8MjU2OyB2YWwrKykKKwkJCQlwcmludGYoIiV4ICIsIGJ1Zlt2YWwrMjU2XSk7CisJCQlwcmludGYoIlxuIik7CisgIAkJCXJldHVybiAxOworIAkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gdGhlIDE2IGJ5dGVzIG9mIG9vYiBkYXRhIHRoYXQgY29ycmVzcG9uZCB0byBhIDUxMiBieXRlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9yZWFkX29vYih1X2NoYXIgKmJ1ZiwgdWxvbmcgcGFnZV9hZGRyKQoreworCXUxNiB2YWw7CisJaW50IGNudHI7CisgICAgCQorICAJTkFORF9FTkFCTEVfQ0UoKTsgIC8qIHNldCBwaW4gbG93ICovCisJTmFuRF9Db21tYW5kKE5BTkRfQ01EX1JFQURPT0IpOworIAlOYW5EX0FkZHJlc3MoQUREUl9DT0xVTU5fUEFHRSwgcGFnZV9hZGRyKTsKKwlOQU5EX1dBSVRfUkVBRFkoKTsKKworLyoJZG8geworCQkqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDdjKSA9IE5BTkRfQ01EX1NUQVRVUzsKKwkgIHZhbCA9ICoodm9sYXRpbGUgdTMyICopKDB4NjgwMEEwODQpOworCSAgcHJpbnRmKCJ2YWwgPSAleFxuIiwgdmFsKTsJCisJfSB3aGlsZSAoKHZhbCAmIDB4NDApICE9IDB4NDApOworKi8KKwkvKiB0aGUgYWJvdmUgY29kZSBmcm9tIE9TVEJvb3QgZG9lc24ndCB3b3JrLCB3ZSB1c2UgZGVsYXkgKi8KKwlkZWxheSg1MDApOyAvKiB3ZSBnbyB0aHJvdWdoIE5GQyBuZWVkIGEgYmlnZ2VyIGRlbGF5LiAyMDAgaXMgbm90IGVub3VnaCAqLworIAorCWZvciAoY250ciA9IDA7IGNudHIgPCA4OyBjbnRyKyspeworCQl2YWwgPSBSRUFEX05BTkQoTkFORF9BRERSKTsKKwkJKmJ1ZisrID0gdmFsICYgMHhmZjsKKwkJKmJ1ZisrID0gdmFsID4+IDg7CisgIAl9CisgIAorCU5BTkRfV0FJVF9SRUFEWSgpOworCU5BTkRfRElTQUJMRV9DRSgpOyAgLyogc2V0IHBpbiBoaWdoICovCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYxOTVjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9NYWtlZmlsZQpAQCAtMCwwICsxLDQ1IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IFNhbXN1bmcgRWxlY3Ryb25pY3MuCisjIEt5dW5nbWluIFBhcmsgPGt5dW5nbWluLnBhcmtAc2Ftc3VuZy5jb20+CisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk6PSAkKG9iailsaWJvbmVuYW5kLmEKKworQ09CSlMteQk6PSBvbmVuYW5kLm8KKworQ09CSlMJOj0gJChDT0JKUy15KQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKTogJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKFNSQ1RSRUUpL3J1bGVzLm1rCisKK3NpbmNsdWRlICQob2JqKS5kZXBlbmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMgYi94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTNmNzA2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDUgU2Ftc3VuZyBFbGVjdHJvbmlzCisgKiBLeXVuZ21pbiBQYXJrIDxreXVuZ21pbi5wYXJrQHNhbXN1bmcuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2luY2x1ZGUgIm9uZW5hbmRfcmVncy5oIgorCisjaWYgZGVmaW5lZChDRkdfTU1DX09ORU5BTkQpIHx8IGRlZmluZWQoQ0ZHX0dQTUNfT05FTkFORCkKKyNkZWZpbmUgb25lbmFuZF9yZWFkdyhhKQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkKKyNkZWZpbmUgb25lbmFuZF93cml0ZXcodiwgYSkJKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGEpKSA9ICh1MTYpICh2KSkKKworI2RlZmluZSBTQU1TVU5HX01GUl9JRAkJMHhFQworI2RlZmluZSBLRk0xRzE2UTJBX0RFVl9JRAkweDMwCisjZGVmaW5lIEtGTjJHMTZRMkFfREVWX0lECTB4NDAKKworCisjZGVmaW5lIFRISVNfT05FTkFORChhKQkJKE9ORU5BTkRfQUREUiArIChhKSkKKworI2RlZmluZSBSRUFEX0lOVEVSUlVQVCgpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpCisKKyNkZWZpbmUgUkVBRF9DVFJMX1NUQVRVUygpCQkJCQkJXAorCW9uZW5hbmRfcmVhZHcoVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NUUkxfU1RBVFVTKSkKKworI2RlZmluZSBSRUFEX0VDQ19TVEFUVVMoKQkJCQkJCVwKKwlvbmVuYW5kX3JlYWR3KFRISVNfT05FTkFORChPTkVOQU5EX1JFR19FQ0NfU1RBVFVTKSkKKwkKKyNkZWZpbmUgU0VUX0VNSUZTX0NTX0NPTkZJRyh2KQkJCQkJXAorCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikoT01BUF9FTUlGU19DU19DT05GSUcpID0gKHYpKQorCisjZGVmaW5lIG9uZW5hbmRfYmxvY2tfYWRkcmVzcyhibG9jaykJCShibG9jaykKKyNkZWZpbmUgb25lbmFuZF9zZWN0b3JfYWRkcmVzcyhwYWdlKQkJKHBhZ2UgPDwgMikKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJfYWRkcmVzcygpCQkoKDEgPDwgMykgPDwgOCkKKyNkZWZpbmUgb25lbmFuZF9idWZmZXJyYW1fYWRkcmVzcyhibG9jaykJKDApCisKKyNpZiBkZWZpbmVkKENGR19TWU5DX0JVUlNUX1JFQUQpICYmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9zeW5jX2J1cnN0X3JlYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJdmFsdWUgPSAwCisJCXwgKDB4MSA8PCAxNSkJCS8qIFJlYWQgTW9kZTogU3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDQgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogOCB3b3JkICovCisJCXwgKDB4MSA8PCA3KQkJLyogUkRZIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA2KQkJLyogSU5UIHNpZ25hbCBwbGFyaXR5ICovCisJCXwgKDB4MSA8PCA1KQkJLyogSS9PIGJ1ZmZlciBlbmFibGUgKi8KKwkJOworCW9uZW5hbmRfd3JpdGV3KHZhbHVlLCBUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1lTX0NGRzEpKTsKKworCXZhbHVlID0gMAorCQl8ICg0IDw8IDE2KQkJLyogU3luY2hyb25vdXMgQnVyc3QgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoNCA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYXN5bmNfcmVhZCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwl2YWx1ZSA9IDAKKwkJfCAoMHgwIDw8IDE1KQkJLyogUmVhZCBNb2RlOiBBc3luY2hyb25vdXMgKi8KKwkJfCAoMHg0IDw8IDEyKQkJLyogQnVyc3QgUmVhZCBMYXRlbmN5OiA0IGN5Y2xlcyAqLworCQl8ICgweDAgPDwgOSkJCS8qIEJ1cnN0IExlbmd0aDogY29udGludW91cyAqLworCQl8ICgweDEgPDwgNykJCS8qIFJEWSBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDEgPDwgNikJCS8qIElOVCBzaWduYWwgcGxhcml0eSAqLworCQl8ICgweDAgPDwgNSkJCS8qIEkvTyBidWZmZXIgZGlzYWJsZSAqLworCQk7CisJb25lbmFuZF93cml0ZXcodmFsdWUsIFRISVNfT05FTkFORChPTkVOQU5EX1JFR19TWVNfQ0ZHMSkpOworCisJdmFsdWUgPSAwCisJCXwgKDAgPDwgMTYpCQkvKiBBc3luY2hyb25vdXMgUmVhZCAqLworCQl8ICgxIDw8IDEyKQkJLyogUEdXU1QvV0VMRU4gKi8KKwkJfCAoMSA8PCA4KQkJLyogV1JXU1QgKi8KKwkJfCAoMyA8PCA0KQkJLyogUkRXU1QgKi8KKwkJfCAoMSA8PCAwKQkJLyogRkNMS0RJViA9PiA0OE1IeiAqLworCQk7CisJU0VUX0VNSUZTX0NTX0NPTkZJRyh2YWx1ZSk7Cit9CisjZWxzZQorI2RlZmluZSBzZXRfc3luY19idXJzdF9yZWFkKC4uLikJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfYXN5bmNfcmVhZCguLi4pCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworaW50CitvbmVuYW5kX2NoaXAoKQoreworCXVuc2lnbmVkIHNob3J0IG1mX2lkLCBkZXZfaWQ7CisJbWZfaWQgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShUSElTX09ORU5BTkQoT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lEKSkpOworCWRldl9pZCA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKFRISVNfT05FTkFORChPTkVOQU5EX1JFR19ERVZJQ0VfSUQpKSk7CisKKwlpZihtZl9pZCA9PSBTQU1TVU5HX01GUl9JRCkgeworCQlpZiAoZGV2X2lkID09IEtGTTFHMTZRMkFfREVWX0lEKSB7CisJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMUcgRmxhc2ggXHJcbiIpOworCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChkZXZfaWQgPT0gS0ZOMkcxNlEyQV9ERVZfSUQpIHsKKwkJCXByaW50ZigiRGV0ZWN0ZWQgU2Ftc3VuZyBNdXhPbmVOQU5EMkcgRmxhc2ggXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiBPTkVOQU5EIEZsYXNoIHVuc3VwcG9ydGVkXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIk9ORU5BTkQgRmxhc2ggVW5zdXBwb3J0ZWRcclxuIik7CisJCXJldHVybiAxOworCX0KK30KKworLyogcmVhZCBhIHBhZ2Ugd2l0aCBFQ0MgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9uZW5hbmRfcmVhZF9wYWdlKHVsb25nIGJsb2NrLCB1bG9uZyBwYWdlLCB1X2NoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nICpiYXNlOworCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJdW5zaWduZWQgaW50IG9mZnNldCwgdmFsdWU7CisJdW5zaWduZWQgbG9uZyAqcDsKKwl1bnNpZ25lZCBpbnQgY3RybCwgZWNjOworCXVuc2lnbmVkIHNob3J0IGJibWFya2VyOworI2VuZGlmCisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2Jsb2NrX2FkZHJlc3MoYmxvY2spLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQUREUkVTUzEpKTsKKworCW9uZW5hbmRfd3JpdGV3KG9uZW5hbmRfc2VjdG9yX2FkZHJlc3MocGFnZSksCisJCVRISVNfT05FTkFORChPTkVOQU5EX1JFR19TVEFSVF9BRERSRVNTOCkpOworCisJb25lbmFuZF93cml0ZXcob25lbmFuZF9idWZmZXJfYWRkcmVzcygpLAorCQlUSElTX09ORU5BTkQoT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSKSk7CisKKwlvbmVuYW5kX3dyaXRldyhvbmVuYW5kX2J1ZmZlcnJhbV9hZGRyZXNzKGJsb2NrKSwKKwkJVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyKSk7CisKKwlvbmVuYW5kX3dyaXRldyhPTkVOQU5EX0lOVF9DTEVBUiwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0lOVEVSUlVQVCkpOworCisJb25lbmFuZF93cml0ZXcoT05FTkFORF9DTURfUkVBRCwgVEhJU19PTkVOQU5EKE9ORU5BTkRfUkVHX0NPTU1BTkQpKTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkzMgorIAlwID0gKHVuc2lnbmVkIGxvbmcgKikgYnVmOworI2VuZGlmCisJYmFzZSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX0RBVEFSQU0pOworCisJd2hpbGUgKCEoUkVBRF9JTlRFUlJVUFQoKSAmIE9ORU5BTkRfSU5UX01BU1RFUikpCisJCWNvbnRpbnVlOworCS8qIENoZWNrIGlmIHRoZSBibG9jayBpcyBiYWQuIEJhZCBibG9jayBtYXJrZXJzICAgICovCisJLyogYXJlIHN0b3JlZCBpbiBzcGFyZSBhcmVhIG9mIDFzdCBvciAybmQgcGFnZSAqLworCWlmICgocGFnZSA9PSAwKSB8fCAocGFnZSA9PSAxKSkKKwl7CisJICAgIHVuc2lnbmVkIGxvbmcgKnNwYXJlQXJlYSA9ICh1bnNpZ25lZCBsb25nICopIChPTkVOQU5EX0FERFIgKyBPTkVOQU5EX1NQQVJFUkFNKTsKKwkgICAgYmJtYXJrZXIgPSAqc3BhcmVBcmVhOworICAgICAgICAgICAgLyogZm9yIGJhZCBibG9jayBtYXJrZXJzICovCisgICAgICAgICAgICBpZiAoYmJtYXJrZXIgIT0gMHhGRkZGKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKwl9CisKKwljdHJsID0gUkVBRF9DVFJMX1NUQVRVUygpOworCQorCWlmIChjdHJsICYgT05FTkFORF9DVFJMX0VSUk9SKSB7CisJCWhhbmcoKTsKKwl9CisJCisJaWYgKFJFQURfSU5URVJSVVBUKCkgJiBPTkVOQU5EX0lOVF9SRUFEKSB7CisKKwkJZWNjID0gUkVBRF9FQ0NfU1RBVFVTKCk7CisJCWlmIChlY2MgJiBPTkVOQU5EX0VDQ18yQklUX0FMTCkgeworCQkJaGFuZygpOworCQl9CisJfQorCQorI2lmZGVmIF9fSEFWRV9BUkNIX01FTUNQWTMyCisJLyogMzIgYnl0ZXMgYm91bmRhcnkgbWVtb3J5IGNvcHkgKi8KKwltZW1jcHkzMihidWYsIGJhc2UsIE9ORU5BTkRfUEFHRV9TSVpFKTsKKyNlbHNlCisJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAoT05FTkFORF9QQUdFX1NJWkUgPj4gMik7IG9mZnNldCsrKSB7CisJCXZhbHVlID0gKihiYXNlICsgb2Zmc2V0KTsKKwkJKnArKyA9IHZhbHVlOworIAl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfUEFHRQkJMAorI2RlZmluZSBPTkVOQU5EX1BBR0VTX1BFUl9CTE9DSwkJNjQKKworLyoqCisgKiBvbmVuYW5kX3JlYWRfYmxvY2sgLSBSZWFkIGEgYmxvY2sgZGF0YSB0byBidWYKKyAqIEByZXR1cm4gMCBvbiBzdWNlc3MKKyAqLyAKKworaW50IG9uZW5hbmRfcmVhZF9ibG9jayh1bnNpZ25lZCBjaGFyICpidWYsIHVsb25nIGJsb2NrKQoreworCWludCBwYWdlLCBvZmZzZXQgPSAwOworCisJc2V0X3N5bmNfYnVyc3RfcmVhZCgpOworCisJLyogTk9URTogeW91IG11c3QgcmVhZCBwYWdlIGZyb20gcGFnZSAxIG9mIGJsb2NrIDAgKi8KKwkvKiByZWFkIHRoZSBibG9jayBwYWdlIGJ5IHBhZ2UqLworCWZvciAocGFnZSA9IE9ORU5BTkRfU1RBUlRfUEFHRTsKKwkgICAgcGFnZSA8IE9ORU5BTkRfUEFHRVNfUEVSX0JMT0NLOyBwYWdlKyspIHsKKworCQlpZiAob25lbmFuZF9yZWFkX3BhZ2UoYmxvY2ssIHBhZ2UsIGJ1ZiArIG9mZnNldCkpeworCQkgICAgc2V0X2FzeW5jX3JlYWQoKTsKKwkJICAgIHJldHVybiAxOworCQl9CisKKwkJb2Zmc2V0ICs9IE9ORU5BTkRfUEFHRV9TSVpFOworCX0KKworCXNldF9hc3luY19yZWFkKCk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL210ZC9vbmVuYW5kL29uZW5hbmRfcmVncy5oIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGFjYzhjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy9tdGQvb25lbmFuZC9vbmVuYW5kX3JlZ3MuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L210ZC9vbmVuYW5kX3JlZ3MuaAorICoKKyAqICBPbmVOQU5EIFJlZ2lzdGVyIGhlYWRlciBmaWxlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fT05FTkFORF9SRUdfSAorI2RlZmluZSBfX09ORU5BTkRfUkVHX0gKKworLyogTWVtb3J5IEFkZHJlc3MgTWFwIFRyYW5zbGF0aW9uIChXb3JkIG9yZGVyKSAqLworI2RlZmluZSBPTkVOQU5EX01FTU9SWV9NQVAoeCkJCSgoeCkgPDwgMSkKKworLyoKKyAqIEV4dGVybmFsIEJ1ZmZlclJBTSBhcmVhCisgKi8KKyNkZWZpbmUJT05FTkFORF9CT09UUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDAwMCkKKyNkZWZpbmUJT05FTkFORF9EQVRBUkFNCQkJT05FTkFORF9NRU1PUllfTUFQKDB4MDIwMCkKKyNkZWZpbmUJT05FTkFORF9TUEFSRVJBTQkJT05FTkFORF9NRU1PUllfTUFQKDB4ODAxMCkKKworLyoKKyAqIE9uZU5BTkQgUmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgT05FTkFORF9SRUdfTUFOVUZBQ1RVUkVSX0lECU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0RFVklDRV9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMSkKKyNkZWZpbmUgT05FTkFORF9SRUdfVkVSU0lPTl9JRAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjAwMikKKyNkZWZpbmUgT05FTkFORF9SRUdfREFUQV9CVUZGRVJfU0laRQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDAzKQorI2RlZmluZSBPTkVOQU5EX1JFR19CT09UX0JVRkZFUl9TSVpFCU9ORU5BTkRfTUVNT1JZX01BUCgweEYwMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX05VTV9CVUZGRVJTCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA1KQorI2RlZmluZSBPTkVOQU5EX1JFR19URUNITk9MT0dZCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMDA2KQorCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MxCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MyCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDEpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1MzCU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M0CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDMpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M1CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDQpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M2CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M3CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDYpCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NUQVJUX0FERFJFU1M4CU9ORU5BTkRfTUVNT1JZX01BUCgweEYxMDcpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQlVGRkVSCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0NPTU1BTkQJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyMjApCisjZGVmaW5lIE9ORU5BTkRfUkVHX1NZU19DRkcxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjIxKQorI2RlZmluZSBPTkVOQU5EX1JFR19TWVNfQ0ZHMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RjIyMikKKyNkZWZpbmUgT05FTkFORF9SRUdfQ1RSTF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNDApCisjZGVmaW5lIE9ORU5BTkRfUkVHX0lOVEVSUlVQVAkJT05FTkFORF9NRU1PUllfTUFQKDB4RjI0MSkKKyNkZWZpbmUgT05FTkFORF9SRUdfU1RBUlRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjRDKQorI2RlZmluZSBPTkVOQU5EX1JFR19FTkRfQkxPQ0tfQUREUkVTUwlPTkVOQU5EX01FTU9SWV9NQVAoMHhGMjREKQorI2RlZmluZSBPTkVOQU5EX1JFR19XUF9TVEFUVVMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEYyNEUpCisKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1NUQVRVUwkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMCkKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00wCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjAxKQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzAJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDIpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19NMQkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwMykKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX1MxCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA0KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfTTIJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDUpCisjZGVmaW5lIE9ORU5BTkRfUkVHX0VDQ19TMgkJT05FTkFORF9NRU1PUllfTUFQKDB4RkYwNikKKyNkZWZpbmUgT05FTkFORF9SRUdfRUNDX00zCQlPTkVOQU5EX01FTU9SWV9NQVAoMHhGRjA3KQorI2RlZmluZSBPTkVOQU5EX1JFR19FQ0NfUzMJCU9ORU5BTkRfTUVNT1JZX01BUCgweEZGMDgpCisKKy8qCisgKiBEZXZpY2UgSUQgUmVnaXN0ZXIgRjAwMWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV9TSElGVAkoNCkKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfSVNfRERQCQkoMSA8PCAzKQorI2RlZmluZSBPTkVOQU5EX0RFVklDRV9JU19ERU1VWAkJKDEgPDwgMikKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfVkNDX01BU0sJCSgweDMpCisKKyNkZWZpbmUgT05FTkFORF9ERVZJQ0VfREVOU0lUWV81MTJNYgkoMHgwMDIpCisKKy8qCisgKiBWZXJzaW9uIElEIFJlZ2lzdGVyIEYwMDJoIChSKQorICovCisjZGVmaW5lIE9ORU5BTkRfVkVSU0lPTl9QUk9DRVNTX1NISUZUCSg4KQorCisvKgorICogU3RhcnQgQWRkcmVzcyAxIEYxMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9ERFBfU0hJRlQJCSgxNSkKKworLyoKKyAqIFN0YXJ0IEFkZHJlc3MgOCBGMTA3aCAoUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfRlBBX01BU0sJCSgweDNmKQorI2RlZmluZSBPTkVOQU5EX0ZQQV9TSElGVAkJKDIpCisjZGVmaW5lIE9ORU5BTkRfRlNBX01BU0sJCSgweDAzKQorCisvKgorICogU3RhcnQgQnVmZmVyIFJlZ2lzdGVyIEYyMDBoIChSL1cpCisgKi8KKyNkZWZpbmUgT05FTkFORF9CU0FfTUFTSwkJKDB4MDMpCisjZGVmaW5lIE9ORU5BTkRfQlNBX1NISUZUCQkoOCkKKyNkZWZpbmUgT05FTkFORF9CU0FfQk9PVFJBTQkJKDAgPDwgMikKKyNkZWZpbmUgT05FTkFORF9CU0FfREFUQVJBTTAJCSgyIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfQlNBX0RBVEFSQU0xCQkoMyA8PCAyKQorI2RlZmluZSBPTkVOQU5EX0JTQ19NQVNLCQkoMHgwMykKKworLyoKKyAqIENvbW1hbmQgUmVnaXN0ZXIgRjIyMGggKFIvVykKKyAqLworI2RlZmluZSBPTkVOQU5EX0NNRF9SRUFECQkoMHgwMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRE9PQgkJKDB4MTMpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1BST0cJCSgweDgwKQorI2RlZmluZSBPTkVOQU5EX0NNRF9QUk9HT09CCQkoMHgxQSkKKyNkZWZpbmUgT05FTkFORF9DTURfVU5MT0NLCQkoMHgyMykKKyNkZWZpbmUgT05FTkFORF9DTURfTE9DSwkJKDB4MkEpCisjZGVmaW5lIE9ORU5BTkRfQ01EX0xPQ0tfVElHSFQJCSgweDJDKQorI2RlZmluZSBPTkVOQU5EX0NNRF9FUkFTRQkJKDB4OTQpCisjZGVmaW5lIE9ORU5BTkRfQ01EX1JFU0VUCQkoMHhGMCkKKyNkZWZpbmUgT05FTkFORF9DTURfUkVBRElECQkoMHg5MCkKKworLyogTk9URTogVGhvc2UgYXJlIG5vdCAqUkVBTCogY29tbWFuZHMgKi8KKyNkZWZpbmUgT05FTkFORF9DTURfQlVGRkVSUkFNCQkoMHgxOTc4KQorCisvKgorICogU3lzdGVtIENvbmZpZ3VyYXRpb24gMSBSZWdpc3RlciBGMjIxaCAoUiwgUi9XKQorICovCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfU1lOQ19SRUFECSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JSTAkJKDEyKQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0JMCQkoOSkKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9OT19FQ0MJCSgxIDw8IDgpCisjZGVmaW5lIE9ORU5BTkRfU1lTX0NGRzFfUkRZCQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX0lOVAkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9TWVNfQ0ZHMV9JT0JFCQkoMSA8PCA1KQorI2RlZmluZSBPTkVOQU5EX1NZU19DRkcxX1JEWV9DT05GCSgxIDw8IDQpCisKKy8qCisgKiBDb250cm9sbGVyIFN0YXR1cyBSZWdpc3RlciBGMjQwaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0NUUkxfT05HTwkJKDEgPDwgMTUpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9MT0NLCQkoMSA8PCAxNCkKKyNkZWZpbmUgT05FTkFORF9DVFJMX0xPQUQJCSgxIDw8IDEzKQorI2RlZmluZSBPTkVOQU5EX0NUUkxfUFJPR1JBTQkJKDEgPDwgMTIpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUkFTRQkJKDEgPDwgMTEpCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9FUlJPUgkJKDEgPDwgMTApCisjZGVmaW5lIE9ORU5BTkRfQ1RSTF9SU1RCCQkoMSA8PCA3KQorCisvKgorICogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciBGMjQxaCAoUikKKyAqLworI2RlZmluZSBPTkVOQU5EX0lOVF9NQVNURVIJCSgxIDw8IDE1KQorI2RlZmluZSBPTkVOQU5EX0lOVF9SRUFECQkoMSA8PCA3KQorI2RlZmluZSBPTkVOQU5EX0lOVF9XUklURQkJKDEgPDwgNikKKyNkZWZpbmUgT05FTkFORF9JTlRfRVJBU0UJCSgxIDw8IDUpCisjZGVmaW5lIE9ORU5BTkRfSU5UX1JFU0VUCQkoMSA8PCA0KQorI2RlZmluZSBPTkVOQU5EX0lOVF9DTEVBUgkJKDAgPDwgMCkKKworLyoKKyAqIE5BTkQgRmxhc2ggV3JpdGUgUHJvdGVjdGlvbiBTdGF0dXMgUmVnaXN0ZXIgRjI0RWggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9XUF9VUwkJCSgxIDw8IDIpCisjZGVmaW5lIE9ORU5BTkRfV1BfTFMJCQkoMSA8PCAxKQorI2RlZmluZSBPTkVOQU5EX1dQX0xUUwkJCSgxIDw8IDApCisKKy8qCisgKiBFQ0MgU3RhdHVzIFJlaWdzZXIgRkYwMGggKFIpCisgKi8KKyNkZWZpbmUgT05FTkFORF9FQ0NfMUJJVAkJKDEgPDwgMCkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVAkJKDEgPDwgMSkKKyNkZWZpbmUgT05FTkFORF9FQ0NfMkJJVF9BTEwJCSgweEFBQUEpCisKKyNlbmRpZgkvKiBfX09ORU5BTkRfUkVHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9ydGMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYnJ0Yy5hCisKK0NPQkpTLXkgKz0gZGF0ZS5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMgYi94LWxvYWRlci9kcml2ZXJzL3J0Yy9kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvcnRjL2RhdGUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogRGF0ZSAmIFRpbWUgc3VwcG9ydCBmb3IgUGhpbGlwcyBQQ0Y4NTYzIFJUQworICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8cnRjLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfREFURSkgfHwgZGVmaW5lZChDT05GSUdfVElNRVNUQU1QKQorCisjZGVmaW5lIEZFQlJVQVJZCQkyCisjZGVmaW5lCVNUQVJUT0ZUSU1FCQkxOTcwCisjZGVmaW5lIFNFQ0RBWQkJCTg2NDAwTAorI2RlZmluZSBTRUNZUgkJCShTRUNEQVkgKiAzNjUpCisjZGVmaW5lCWxlYXB5ZWFyKHllYXIpCQkoKHllYXIpICUgNCA9PSAwKQorI2RlZmluZQlkYXlzX2luX3llYXIoYSkJCShsZWFweWVhcihhKSA/IDM2NiA6IDM2NSkKKyNkZWZpbmUJZGF5c19pbl9tb250aChhKQkobW9udGhfZGF5c1soYSkgLSAxXSkKKworc3RhdGljIGludCBtb250aF9kYXlzWzEyXSA9IHsKKwkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCit9OworCisvKgorICogVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyIC0gaS5lLiBhZnRlciAxNzUyIChpbiB0aGUgVUspCisgKi8KK3ZvaWQgR3JlZ29yaWFuRGF5KHN0cnVjdCBydGNfdGltZSAqIHRtKQoreworCWludCBsZWFwc1RvRGF0ZTsKKwlpbnQgbGFzdFllYXI7CisJaW50IGRheTsKKwlpbnQgTW9udGhPZmZzZXRbXSA9IHsgMCwzMSw1OSw5MCwxMjAsMTUxLDE4MSwyMTIsMjQzLDI3MywzMDQsMzM0IH07CisKKwlsYXN0WWVhcj10bS0+dG1feWVhci0xOworCisJLyoKKwkgKiBOdW1iZXIgb2YgbGVhcCBjb3JyZWN0aW9ucyB0byBhcHBseSB1cCB0byBlbmQgb2YgbGFzdCB5ZWFyCisJICovCisJbGVhcHNUb0RhdGUgPSBsYXN0WWVhci80IC0gbGFzdFllYXIvMTAwICsgbGFzdFllYXIvNDAwOworCisJLyoKKwkgKiBUaGlzIHllYXIgaXMgYSBsZWFwIHllYXIgaWYgaXQgaXMgZGl2aXNpYmxlIGJ5IDQgZXhjZXB0IHdoZW4gaXQgaXMKKwkgKiBkaXZpc2libGUgYnkgMTAwIHVubGVzcyBpdCBpcyBkaXZpc2libGUgYnkgNDAwCisJICoKKwkgKiBlLmcuIDE5MDQgd2FzIGEgbGVhcCB5ZWFyLCAxOTAwIHdhcyBub3QsIDE5OTYgaXMsIGFuZCAyMDAwIHdpbGwgYmUKKwkgKi8KKwlpZigodG0tPnRtX3llYXIlND09MCkgJiYKKwkgICAoKHRtLT50bV95ZWFyJTEwMCE9MCkgfHwgKHRtLT50bV95ZWFyJTQwMD09MCkpICYmCisJICAgKHRtLT50bV9tb24+MikpIHsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgRmViLiAyOSBpbiBhIGxlYXAgeWVhcgorCQkgKi8KKwkJZGF5PTE7CisJfSBlbHNlIHsKKwkJZGF5PTA7CisJfQorCisJZGF5ICs9IGxhc3RZZWFyKjM2NSArIGxlYXBzVG9EYXRlICsgTW9udGhPZmZzZXRbdG0tPnRtX21vbi0xXSArIHRtLT50bV9tZGF5OworCisJdG0tPnRtX3dkYXk9ZGF5JTc7Cit9CisKK3ZvaWQgdG9fdG0oaW50IHRpbSwgc3RydWN0IHJ0Y190aW1lICogdG0pCit7CisJcmVnaXN0ZXIgaW50ICAgIGk7CisJcmVnaXN0ZXIgbG9uZyAgIGhtcywgZGF5OworCisJZGF5ID0gdGltIC8gU0VDREFZOworCWhtcyA9IHRpbSAlIFNFQ0RBWTsKKworCS8qIEhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFyZSBlYXN5ICovCisJdG0tPnRtX2hvdXIgPSBobXMgLyAzNjAwOworCXRtLT50bV9taW4gPSAoaG1zICUgMzYwMCkgLyA2MDsKKwl0bS0+dG1fc2VjID0gKGhtcyAlIDM2MDApICUgNjA7CisKKwkvKiBOdW1iZXIgb2YgeWVhcnMgaW4gZGF5cyAqLworCWZvciAoaSA9IFNUQVJUT0ZUSU1FOyBkYXkgPj0gZGF5c19pbl95ZWFyKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5feWVhcihpKTsKKwl9CisJdG0tPnRtX3llYXIgPSBpOworCisJLyogTnVtYmVyIG9mIG1vbnRocyBpbiBkYXlzIGxlZnQgKi8KKwlpZiAobGVhcHllYXIodG0tPnRtX3llYXIpKSB7CisJCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjk7CisJfQorCWZvciAoaSA9IDE7IGRheSA+PSBkYXlzX2luX21vbnRoKGkpOyBpKyspIHsKKwkJZGF5IC09IGRheXNfaW5fbW9udGgoaSk7CisJfQorCWRheXNfaW5fbW9udGgoRkVCUlVBUlkpID0gMjg7CisJdG0tPnRtX21vbiA9IGk7CisKKwkvKiBEYXlzIGFyZSB3aGF0IGlzIGxlZnQgb3ZlciAoKzEpIGZyb20gYWxsIHRoYXQuICovCisJdG0tPnRtX21kYXkgPSBkYXkgKyAxOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIGRheSBvZiB3ZWVrCisJICovCisJR3JlZ29yaWFuRGF5KHRtKTsKK30KKworLyogQ29udmVydHMgR3JlZ29yaWFuIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICogQXNzdW1lcyBpbnB1dCBpbiBub3JtYWwgZGF0ZSBmb3JtYXQsIGkuZS4gMTk4MC0xMi0zMSAyMzo1OTo1OQorICogPT4geWVhcj0xOTgwLCBtb249MTIsIGRheT0zMSwgaG91cj0yMywgbWluPTU5LCBzZWM9NTkuCisgKgorICogW0ZvciB0aGUgSnVsaWFuIGNhbGVuZGFyICh3aGljaCB3YXMgdXNlZCBpbiBSdXNzaWEgYmVmb3JlIDE5MTcsCisgKiBCcml0YWluICYgY29sb25pZXMgYmVmb3JlIDE3NTIsIGFueXdoZXJlIGVsc2UgYmVmb3JlIDE1ODIsCisgKiBhbmQgaXMgc3RpbGwgaW4gdXNlIGJ5IHNvbWUgY29tbXVuaXRpZXMpIGxlYXZlIG91dCB0aGUKKyAqIC15ZWFyLzEwMCt5ZWFyLzQwMCB0ZXJtcywgYW5kIGFkZCAxMC5dCisgKgorICogVGhpcyBhbGdvcml0aG0gd2FzIGZpcnN0IHB1Ymxpc2hlZCBieSBHYXVzcyAoSSB0aGluaykuCisgKgorICogV0FSTklORzogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJmbG93IG9uIDIxMDYtMDItMDcgMDY6Mjg6MTYgb24KKyAqIG1hY2hpbmVzIHdlcmUgbG9uZyBpcyAzMi1iaXQhIChIb3dldmVyLCBhcyB0aW1lX3QgaXMgc2lnbmVkLCB3ZQorICogd2lsbCBhbHJlYWR5IGdldCBwcm9ibGVtcyBhdCBvdGhlciBwbGFjZXMgb24gMjAzOC0wMS0xOSAwMzoxNDowOCkKKyAqLwordW5zaWduZWQgbG9uZworbWt0aW1lICh1bnNpZ25lZCBpbnQgeWVhciwgdW5zaWduZWQgaW50IG1vbiwKKwl1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgaG91ciwKKwl1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgc2VjKQoreworCWlmICgwID49IChpbnQpIChtb24gLT0gMikpIHsJLyogMS4uMTIgLT4gMTEsMTIsMS4uMTAgKi8KKwkJbW9uICs9IDEyOwkJLyogUHV0cyBGZWIgbGFzdCBzaW5jZSBpdCBoYXMgbGVhcCBkYXkgKi8KKwkJeWVhciAtPSAxOworCX0KKworCXJldHVybiAoKCgKKwkJKHVuc2lnbmVkIGxvbmcpICh5ZWFyLzQgLSB5ZWFyLzEwMCArIHllYXIvNDAwICsgMzY3Km1vbi8xMiArIGRheSkgKworCQkJeWVhciozNjUgLSA3MTk0OTkKKwkgICAgKSoyNCArIGhvdXIgLyogbm93IGhhdmUgaG91cnMgKi8KKwkgICkqNjAgKyBtaW4gLyogbm93IGhhdmUgbWludXRlcyAqLworCSkqNjAgKyBzZWM7IC8qIGZpbmFsbHkgc2Vjb25kcyAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4NGJlNAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlCkBAIC0wLDAgKzEsNDcgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnNlcmlhbC5hCisKK0NPQkpTLXkgKz0gbnMxNjU1MC5vCitDT0JKUy15ICs9IHNlcmlhbC5vCisKK0NPQkpTCTo9ICQoc29ydCAkKENPQkpTLXkpKQorU1JDUwk6PSAkKENPQkpTOi5vPS5jKQorT0JKUwk6PSAkKGFkZHByZWZpeCAkKG9iaiksJChDT0JKUykpCisKK2FsbDoJJChMSUIpCisKKyQoTElCKToJJChvYmopLmRlcGVuZCAkKE9CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMgYi94LWxvYWRlci9kcml2ZXJzL3NlcmlhbC9uczE2NTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNWMxMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL25zMTY1NTAuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICogIAorICogQ09NMSBOUzE2NTUwIHN1cHBvcnQKKyAqIG9yaWdpbmFsbHkgZnJvbSBsaW51eCBzb3VyY2UgKGFyY2gvcHBjL2Jvb3QvbnMxNjU1MC5jKQorICogbW9kaWZpZWQgdG8gdXNlIENGR19JU0FfTUVNIGFuZCBuZXcgZGVmaW5lcworICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKworI2lmZGVmIENGR19QUklOVEYKKyNpZmRlZiBDRkdfTlMxNjU1MAorCisjaW5jbHVkZSA8bnMxNjU1MC5oPgorCisjZGVmaW5lIExDUlZBTCBMQ1JfOE4xCQkJCQkvKiA4IGRhdGEsIDEgc3RvcCwgbm8gcGFyaXR5ICovCisjZGVmaW5lIE1DUlZBTCAoTUNSX0RUUiB8IE1DUl9SVFMpCQkJLyogUlRTL0RUUiAqLworI2RlZmluZSBGQ1JWQUwgKEZDUl9GSUZPX0VOIHwgRkNSX1JYU1IgfCBGQ1JfVFhTUikJLyogQ2xlYXIgJiBlbmFibGUgRklGT3MgKi8KKwordm9pZCBOUzE2NTUwX2luaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcikKK3sKKwljb21fcG9ydC0+aWVyID0gMHgwMDsKKyNpZmRlZiBDT05GSUdfT01BUAorCWNvbV9wb3J0LT5tZHIxID0gMHg3OyAgIC8qIG1vZGUgc2VsZWN0IHJlc2V0IFRMMTZDNzUwKi8KKyNlbmRpZgorCWNvbV9wb3J0LT5sY3IgPSBMQ1JfQktTRSB8IExDUlZBTDsKKwljb21fcG9ydC0+ZGxsID0gYmF1ZF9kaXZpc29yICYgMHhmZjsKKwljb21fcG9ydC0+ZGxtID0gKGJhdWRfZGl2aXNvciA+PiA4KSAmIDB4ZmY7CisJY29tX3BvcnQtPmxjciA9IExDUlZBTDsKKwljb21fcG9ydC0+bWNyID0gTUNSVkFMOworCWNvbV9wb3J0LT5mY3IgPSBGQ1JWQUw7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUCkKKwljb21fcG9ydC0+bWRyMSA9IDA7CS8qIHNlbGVjdCB1YXJ0IG1vZGUgKi8KKyNlbmRpZgorfQorCit2b2lkIE5TMTY1NTBfcmVpbml0IChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpCit7CisJY29tX3BvcnQtPmllciA9IDB4MDA7CisJY29tX3BvcnQtPmxjciA9IExDUl9CS1NFOworCWNvbV9wb3J0LT5kbGwgPSBiYXVkX2Rpdmlzb3IgJiAweGZmOworCWNvbV9wb3J0LT5kbG0gPSAoYmF1ZF9kaXZpc29yID4+IDgpICYgMHhmZjsKKwljb21fcG9ydC0+bGNyID0gTENSVkFMOworCWNvbV9wb3J0LT5tY3IgPSBNQ1JWQUw7CisJY29tX3BvcnQtPmZjciA9IEZDUlZBTDsKK30KKwordm9pZCBOUzE2NTUwX3B1dGMgKE5TMTY1NTBfdCBjb21fcG9ydCwgY2hhciBjKQoreworCXdoaWxlICgoY29tX3BvcnQtPmxzciAmIExTUl9USFJFKSA9PSAwKTsKKwljb21fcG9ydC0+dGhyID0gYzsKK30KKworY2hhciBOUzE2NTUwX2dldGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwl3aGlsZSAoKGNvbV9wb3J0LT5sc3IgJiBMU1JfRFIpID09IDApOworCXJldHVybiAoY29tX3BvcnQtPnJicik7Cit9CisKK2ludCBOUzE2NTUwX3RzdGMgKE5TMTY1NTBfdCBjb21fcG9ydCkKK3sKKwlyZXR1cm4gKChjb21fcG9ydC0+bHNyICYgTFNSX0RSKSAhPSAwKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jIGIveC1sb2FkZXIvZHJpdmVycy9zZXJpYWwvc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvc2VyaWFsL3NlcmlhbC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBSb2IgVGF5bG9yLCBGbHlpbmcgUGlnIFN5c3RlbXMuIHJvYnRAZmx5aW5ncGlnLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisKKyNpZmRlZiBDRkdfUFJJTlRGCisjaWZkZWYgQ0ZHX05TMTY1NTBfU0VSSUFMCisKKyNpbmNsdWRlIDxuczE2NTUwLmg+CisjaWZkZWYgQ0ZHX05TODczMDgKKyNpbmNsdWRlIDxuczg3MzA4Lmg+CisjZW5kaWYKKworI2lmIENPTkZJR19DT05TX0lOREVYID09IDEKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTE7CisjZWxpZiBDT05GSUdfQ09OU19JTkRFWCA9PSAyCitzdGF0aWMgTlMxNjU1MF90IGNvbnNvbGUgPSAoTlMxNjU1MF90KSBDRkdfTlMxNjU1MF9DT00yOworI2VsaWYgQ09ORklHX0NPTlNfSU5ERVggPT0gMworc3RhdGljIE5TMTY1NTBfdCBjb25zb2xlID0gKE5TMTY1NTBfdCkgQ0ZHX05TMTY1NTBfQ09NMzsKKyNlbGlmIENPTkZJR19DT05TX0lOREVYID09IDQKK3N0YXRpYyBOUzE2NTUwX3QgY29uc29sZSA9IChOUzE2NTUwX3QpIENGR19OUzE2NTUwX0NPTTQ7CisjZWxzZQorI2Vycm9yIG5vIHZhbGlkIGNvbnNvbGUgZGVmaW5lZAorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2FsY19kaXZpc29yICh2b2lkKQoreworLy8JREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisJLyogSWYgY2FuJ3QgY2xlYW5seSBjbG9jayAxMTUyMDAgc2V0IGRpdiB0byAxICovCisJaWYgKChDRkdfTlMxNjU1MF9DTEsgPT0gMTIwMDAwMDApICYmIChDT05GSUdfQkFVRFJBVEUgPT0gMTE1MjAwKSkgeworCQljb25zb2xlLT5vc2NfMTJtX3NlbCA9IE9TQ18xMk1fU0VMOwkvKiBlbmFibGUgNi41ICogZGl2aXNvciAqLworCQlyZXR1cm4gKDEpOwkJCQkvKiByZXR1cm4gMSBmb3IgYmFzZSBkaXZpc29yICovCisJfQorCWNvbnNvbGUtPm9zY18xMm1fc2VsID0gMDsJCQkvKiBjbGVhciBpZiBwcmV2aXNvdWx5IHNldCAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDE2MTApIHx8IGRlZmluZWQoQ09ORklHX09NQVAxNzEwKQorCS8qIElmIGNhbid0IGNsZWFubHkgY2xvY2sgMTE1MjAwIHNldCBkaXYgdG8gMSAqLworCWlmICgoQ0ZHX05TMTY1NTBfQ0xLID09IDQ4MDAwMDAwKSAmJiAoQ09ORklHX0JBVURSQVRFID09IDExNTIwMCkpIHsKKwkJcmV0dXJuICgyNik7CQkvKiByZXR1cm4gMjYgZm9yIGJhc2UgZGl2aXNvciAqLworCX0KKyNlbmRpZgorCXJldHVybiAoQ0ZHX05TMTY1NTBfQ0xLIC8gMTYgLyBDT05GSUdfQkFVRFJBVEUpOworfQorCitpbnQgc2VyaWFsX2luaXQgKHZvaWQpCit7CisJaW50IGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKworI2lmZGVmIENGR19OUzg3MzA4CisJaW5pdGlhbGlzZV9uczg3MzA4KCk7CisjZW5kaWYKKworCU5TMTY1NTBfaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKKworCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRjKGNvbnN0IGNoYXIgYykKK3sKKwlpZiAoYyA9PSAnXG4nKQorCQlOUzE2NTUwX3B1dGMoY29uc29sZSwgJ1xyJyk7CisKKwlOUzE2NTUwX3B1dGMoY29uc29sZSwgYyk7Cit9CisKK3ZvaWQKK3NlcmlhbF9wdXRzIChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlzZXJpYWxfcHV0YyAoKnMrKyk7CisJfQorfQorCisKK2ludAorc2VyaWFsX2dldGModm9pZCkKK3sKKwlyZXR1cm4gTlMxNjU1MF9nZXRjKGNvbnNvbGUpOworfQorCitpbnQKK3NlcmlhbF90c3RjKHZvaWQpCit7CisJcmV0dXJuIE5TMTY1NTBfdHN0Yyhjb25zb2xlKTsKK30KKwordm9pZAorc2VyaWFsX3NldGJyZyAodm9pZCkKK3sKKwlpbnQgY2xvY2tfZGl2aXNvcjsKKworICAgIGNsb2NrX2Rpdmlzb3IgPSBjYWxjX2Rpdmlzb3IoKTsKKwlOUzE2NTUwX3JlaW5pdChjb25zb2xlLCBjbG9ja19kaXZpc29yKTsKK30KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIveC1sb2FkZXIvZHJpdmVycy91c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5ZDEwMQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2LTIwMDkKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorIyBNQSAwMjExMS0xMzA3IFVTQQorIworCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworTElCCTo9ICQob2JqKWxpYnVzYi5hCisKK0NPQkpTLXkgKz0gdXNiLm8KKworQ09CSlMJOj0gJChzb3J0ICQoQ09CSlMteSkpCitTUkNTCTo9ICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKENPQkpTKSkKKworYWxsOgkkKExJQikKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNDY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2RyaXZlcnMvdXNiL3VzYi5jCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogVVNCIGJvb3Rsb2FkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmljayBCcm9uc29uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisjaW5jbHVkZSAidXNiLmgiCisKK2V4dGVybiB2b2lkIHVkZWxheSAodW5zaWduZWQgbG9uZyB1c2Vjcyk7CisKK3R5cGVkZWYgaW50IGJvb3Rfb3NfZm4gKHZvaWQpOworCisvKiBzZW5kIGEgcGFja2V0IHZpYSBVU0IgKi8KK2ludCB1c2Jfc2VuZF9wYWNrZXQodW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgcGFja2V0X3NpemUpCisgICB7CisgICBpbnQgcmV0ID0gMDsKKworICAgaWYgKCEoKnBlcmlfdHhjc3IgJiBNVVNCX1RYQ1NSX1RYUEtUUkRZKSkKKyAgICAgICB7CisgICAgICAgdW5zaWduZWQgaW50IGNudHI7CisKKyAgICAgICBmb3IgKGNudHIgPSAwOyBjbnRyIDwgcGFja2V0X3NpemU7IGNudHIrKykKKyAgICAgICAgICAgKmJ1bGtfZmlmbyA9IGJ1ZmZlcltjbnRyXTsKKworICAgICAgICpwZXJpX3R4Y3NyIHw9IE1VU0JfVFhDU1JfVFhQS1RSRFk7CisKKyAgICAgICByZXQgPSBwYWNrZXRfc2l6ZTsKKyAgICAgICB9CisgICByZXR1cm4gcmV0OworICAgfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IHVzYl9yZWN2ICh1OCAqYnVmZmVyLCBpbnQgc2l6ZSkKK3sKKyAgIGludCBjbnRyOworICAgdTE2IGNvdW50ID0gMDsKKworICAgaWYgKCpwZXJpX3J4Y3NyICYgTVVTQl9SWENTUl9SWFBLVFJEWSkKKyAgICAgICB7CisgICAgICAgY291bnQgPSAqcnhjb3VudDsKKyAgICAgICBmb3IgKGNudHIgPSAwOyBjbnRyIDwgY291bnQ7IGNudHIrKykKKyAgICAgICAgICAgeworICAgICAgICAgICAqYnVmZmVyKysgPSAqYnVsa19maWZvOworICAgICAgICAgICB9CisgICAgICAgICAgIC8qIENsZWFyIHRoZSBSWFBLVFJEWSBiaXQgKi8KKyAgICAgICAqcGVyaV9yeGNzciAmPSB+TVVTQl9SWENTUl9SWFBLVFJEWTsKKyAgICAgICB9CisgICByZXR1cm4gY291bnQ7ICAvKiBGSVhNRSAqLworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciB1c2Jfb3V0YnVmZmVyW1JYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wXTsKKworaW50IHVzYl9zZW5kX2J1ZmZlcih1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBidWZmZXJfc2l6ZSkKK3sKKyAgICBpbnQgYnVmZmVyX2luZGV4ID0gMCwKKyAgICAgICAgcGFja2V0X3NpemUsCisgICAgICAgIHJldHZhbCA9IDA7CisKKyAgICB3aGlsZSAoKGJ1ZmZlcl9pbmRleCA8IGJ1ZmZlcl9zaXplKSAmJgorICAgICAgICAgICAocmV0dmFsID09IDApKSB7CisgICAgICAgIHBhY2tldF9zaXplID0gUlhfRU5EUE9JTlRfTUFYSU1VTV9QQUNLRVRfU0laRV8yXzA7CisgICAgICAgIGlmICgoYnVmZmVyX2luZGV4ICsgcGFja2V0X3NpemUpID4gYnVmZmVyX3NpemUpCisgICAgICAgICAgICBwYWNrZXRfc2l6ZSA9IGJ1ZmZlcl9zaXplIC0gYnVmZmVyX2luZGV4OworCisgICAgICAgIHJldHZhbCA9IHVzYl9zZW5kX3BhY2tldCgmYnVmZmVyW2J1ZmZlcl9pbmRleF0sIHBhY2tldF9zaXplKTsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBwYWNrZXRfc2l6ZSkgeworICAgICAgICAgICAgYnVmZmVyX2luZGV4ICs9IHBhY2tldF9zaXplOworICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgfQorICAgfQorCisgICByZXR1cm4gYnVmZmVyX2luZGV4OworfQorCitzdGF0aWMgdm9pZCB1c2JfbXNnICh1bnNpZ25lZCBpbnQgY21kLCBjb25zdCBjaGFyICptc2cpCisgICB7CisgICB1bnNpZ25lZCBjaGFyICpwX2NoYXIgPSB1c2Jfb3V0YnVmZmVyOworCisgICAqIChpbnQgKikgcF9jaGFyID0gY21kOworICAgcF9jaGFyICs9IHNpemVvZiAoY21kKTsKKyAgIGlmIChtc2cpCisgICAgICAgeworICAgICAgIHdoaWxlICgqbXNnKQorICAgICAgICAgICAqcF9jaGFyKys9ICptc2crKzsKKyAgICAgICAqcF9jaGFyKys9IDA7CisgICAgICAgfQorICAgdXNiX3NlbmRfcGFja2V0ICh1c2Jfb3V0YnVmZmVyLCBwX2NoYXIgLSB1c2Jfb3V0YnVmZmVyKTsKKyAgIH0KKworc3RhdGljIHZvaWQgdXNiX2NvZGUgKHVuc2lnbmVkIGludCBjbWQsIHUzMiBjb2RlMSwgdTMyIGNvZGUyKQorICAgeworICAgdW5zaWduZWQgaW50ICpwX2ludCA9ICh1bnNpZ25lZCBpbnQgKikgdXNiX291dGJ1ZmZlcjsKKworICAgKnBfaW50KysgPSBjbWQ7CisgICAqcF9pbnQrKyA9IGNvZGUxOworICAgKnBfaW50KysgPSBjb2RlMjsKKyAgIHVzYl9zZW5kX3BhY2tldCAodXNiX291dGJ1ZmZlciwgKCh1bnNpZ25lZCBjaGFyICopIHBfaW50KSAtIHVzYl9vdXRidWZmZXIpOworICAgfQorCit2b2lkIGRvX3VzYiAodm9pZCkKKyAgIHsKKyAgIGJvb3Rfb3NfZm4gKmJvb3RfZm47CisgICBpbnQgcmVzOworICAgdTMyIHVzYl9pbmJ1ZmZlcltSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzJfMF07CisgICB1MzIgdG90YWw7CisgICB1OCAqYWRkcjsKKyAgIHUzMiBieXRlczsKKyAgIGludCBjbnRyID0gMDsKKworICAgdXNiX21zZyAoVVNCTE9BRF9DTURfRklMRV9SRVEsICJmaWxlIHJlcSIpOworICAgd2hpbGUoKytjbnRyIDwgMjAwMDAwKSAgLyogdHJ5IGZvciAxIHNlY29uZCB0aGVuIGJhaWwgb3V0ICovCisgICAgICAgeworICAgICAgIHJlcyA9IHVzYl9yZWN2ICgodTggKikgdXNiX2luYnVmZmVyLCBzaXplb2YgKHVzYl9pbmJ1ZmZlcikpOworICAgICAgIGlmICgocmVzID09IFVTQkxPQURfQ01EX1JFU1BPTlNFX0xFTikgJiYgKHVzYl9pbmJ1ZmZlclswXSA9PSBVU0JMT0FEX0NNRF9GSUxFKSkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgdG90YWwgPSB1c2JfaW5idWZmZXJbMV07ICAvKiBnZXQgc2l6ZSBhbmQgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgYWRkciA9ICh1OCAqKSB1c2JfaW5idWZmZXJbMl07CisgICAgICAgICAgICAgICBwcmludGYgKCJVU0JMT0FEX0NNRF9GSUxFOiAlOHVCIEAgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGFkZHIpOworICAgICAgICAgICAgICAgdXNiX2NvZGUgKFVTQkxPQURfQ01EX0VDSE9fU1osIHRvdGFsLCAwKTsKKworICAgICAgICAgICAgICAgYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgd2hpbGUgKGJ5dGVzIDwgdG90YWwpCisgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IHVzYl9yZWN2KCYoKHU4ICopYWRkcilbYnl0ZXNdLCAodG90YWwgLSBieXRlcykpOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHVzYl9jb2RlIChVU0JMT0FEX0NNRF9SRVBPUlRfU1osIHRvdGFsLCAwKTsgIC8qIHRlbGwgaGltIHdlIGdvdCB0aGlzIG1hbnkgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgIHByaW50ZiAoIlJlY2VpdmVkIGZpbGUgT0tcbiIpOworICAgICAgICAgICAgICAgdXNiX21zZyAoVVNCTE9BRF9DTURfRklMRV9SRVEsICJmaWxlIHJlcSIpOyAgLyogc2VlIGlmIHRoZXkgaGF2ZSBhbm90aGVyIGZpbGUgZm9yIHVzICovCisgICAgICAgICAgICAgICBjbnRyID0gMDsKKyAgICAgICAgICAgfQorICAgICAgIGVsc2UgaWYgKChyZXMgPT0gVVNCTE9BRF9DTURfUkVTUE9OU0VfTEVOKSAmJiAodXNiX2luYnVmZmVyWzBdID09IFVTQkxPQURfQ01EX0pVTVApKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBwcmludGYgKCJVU0JMT0FEX0NNRF9KVU1QOiBhZGRyID0gMHgleFxuIiwgdXNiX2luYnVmZmVyWzFdKTsKKyAgICAgICAgICAgICAgIGJvb3RfZm4gPSAoYm9vdF9vc19mbiAqKSB1c2JfaW5idWZmZXJbMV07CisgICAgICAgICAgICAgICBib290X2ZuKCk7ICAvKiBnbyB0byB1LWJvb3QgYW5kIG1heWJlIGtlcm5lbCAqLworICAgICAgICAgICB9CisgICAgICAgZWxzZSBpZiAocmVzID4gMCkKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgcHJpbnRmICgiVW5yZWNvZ25pemVkICVkQiBjb21tYW5kOiAlYyVjJWMlY1xuIiwgcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIqKXVzYl9pbmJ1ZmZlcilbMF0sICgoY2hhciopdXNiX2luYnVmZmVyKVsxXSwgKChjaGFyKil1c2JfaW5idWZmZXIpWzJdLCAoKGNoYXIqKXVzYl9pbmJ1ZmZlcilbM10pOworICAgICAgICAgICB9CisKKyAgICAgICB1ZGVsYXkoMTAwMCk7ICAvKiBkZWxheSAxIG1zIC0tIHN1c3BlY3QgY2xvY2tzIGFyZW4ndCBjb25maWd1cmVkIGFzIGV4cGVjdGVkLCByZXN1bHRpbmcgaW4gYSBzaWduaWZpY2FudGx5IHNob3J0ZXIgZGVsYXkgKi8KKyAgICAgICB9CisgICAgICAgcHJpbnRmKCJVU0IgZG9uZVxuIik7CisgICAgICAgaGFuZygpOworICAgfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmggYi94LWxvYWRlci9kcml2ZXJzL3VzYi91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTY0ZWEzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZHJpdmVycy91c2IvdXNiLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIFVTQiBib290bG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJpY2sgQnJvbnNvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9VU0JfSF8KKyNkZWZpbmUgX1VTQl9IXworCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9CQVNFICAgICAoT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFICsgMHhBQjAwMCkKKworI2RlZmluZSBPTUFQMzRYWF9VU0JfRVAobikgICAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDEwMCArIDB4MTAqKG4pKQorCisjZGVmaW5lIE1VU0JfUlhDU1IgICAgIDB4MDYKKyNkZWZpbmUgTVVTQl9SWENPVU5UICAgICAgIDB4MDgKKyNkZWZpbmUgTVVTQl9UWENTUiAgICAgMHgwMgorI2RlZmluZSBNVVNCX0ZJRk9TSVpFICAgICAgMHgwRgorI2RlZmluZSBPTUFQMzRYWF9VU0JfUlhDU1IobikgICAgICAoT01BUDM0WFhfVVNCX0VQKG4pICsgTVVTQl9SWENTUikKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1JYQ09VTlQobikgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfUlhDT1VOVCkKKyNkZWZpbmUgT01BUDM0WFhfVVNCX1RYQ1NSKG4pICAgICAgKE9NQVAzNFhYX1VTQl9FUChuKSArIE1VU0JfVFhDU1IpCisjZGVmaW5lIE9NQVAzNFhYX1VTQl9GSUZPU0laRShuKSAgIChPTUFQMzRYWF9VU0JfRVAobikgKyBNVVNCX0ZJRk9TSVpFKQorI2RlZmluZSBPTUFQMzRYWF9VU0JfRklGTyhuKSAgICAgICAoT01BUDM0WFhfVVNCX0JBU0UgKyAweDIwICsgKChuKSAqIDQpKQorCisvKiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyAqLworI2RlZmluZSBCVUxLX0VORFBPSU5UIDEKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfcnhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9SWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9SWENTUl9SWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTE2ICpyeGNvdW50ICAgID0gKHZvbGF0aWxlIHUxNiAqKSBPTUFQMzRYWF9VU0JfUlhDT1VOVChCVUxLX0VORFBPSU5UKTsKK3N0YXRpYyB2b2xhdGlsZSB1MTYgKnBlcmlfdHhjc3IgPSAodm9sYXRpbGUgdTE2ICopIE9NQVAzNFhYX1VTQl9UWENTUihCVUxLX0VORFBPSU5UKTsKKyNkZWZpbmUgTVVTQl9UWENTUl9UWFBLVFJEWSAgICAgICAgMHgwMDAxCitzdGF0aWMgdm9sYXRpbGUgdTggICpidWxrX2ZpZm8gID0gKHZvbGF0aWxlIHU4ICAqKSBPTUFQMzRYWF9VU0JfRklGTyhCVUxLX0VORFBPSU5UKTsKKworLyogSW4gaGlnaCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDUxMgorICAgSW4gZnVsbCBzcGVlZCBtb2RlIHBhY2tldHMgYXJlIDY0ICovCisjZGVmaW5lIFJYX0VORFBPSU5UX01BWElNVU1fUEFDS0VUX1NJWkVfMl8wICAoMHgwMjAwKQorI2RlZmluZSBSWF9FTkRQT0lOVF9NQVhJTVVNX1BBQ0tFVF9TSVpFXzFfMSAgKDB4MDA0MCkKKworI2RlZmluZSBNSU4oYSxiKSAoICgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIFBBQ0s0KGEsYixjLGQpICAgICAoKChkKTw8MjQpIHwgKChjKTw8MTYpIHwgKChiKTw8OCkgfCAoYSkpCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEUgUEFDSzQoJ1UnLCAnUycsICdCJywgJ3MnKSAgLyogc2VuZCBmaWxlIHNpemUgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfSlVNUCBQQUNLNCgnVScsICdTJywgJ0InLCAnaicpICAvKiBnbyB3aGVyZSBJIHRlbGwgeW91ICovCisjZGVmaW5lIFVTQkxPQURfQ01EX0ZJTEVfUkVRIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdmJykgIC8qIGZpbGUgcmVxdWVzdCAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9FQ0hPX1NaIFBBQ0s0KCdVJywgJ1MnLCAnQicsICduJykgIC8qIGVjaG8gZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX1JFUE9SVF9TWiBQQUNLNCgnVScsICdTJywgJ0InLCAnbycpICAvKiByZXBvcnQgZmlsZSBzaXplICovCisjZGVmaW5lIFVTQkxPQURfQ01EX01FU1NBR0UgUEFDSzQoJ1UnLCAnUycsICdCJywgJ20nKSAgLyogbWVzc2FnZSBmb3IgZGVidWcgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfTkFORF9EVU1QIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdkJykgIC8qIGR1bXAgTkFORCAqLworI2RlZmluZSBVU0JMT0FEX0NNRF9OQU5EX09PQl9EVU1QIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdiJykgIC8qIGR1bXAgTkFORCBPT0IgKi8KKyNkZWZpbmUgVVNCTE9BRF9DTURfTkFORF9EVU1QX1NaIFBBQ0s0KCdVJywgJ1MnLCAnQicsICdyJykgIC8qIGR1bXAgc2l6ZSAqLworCisjZGVmaW5lIFVTQkxPQURfQ01EX1JFU1BPTlNFX0xFTiAxMgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvZnMvTWFrZWZpbGUgYi94LWxvYWRlci9mcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDE5Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDEKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKyMKKworU1VCRElSUwk6PSBmYXQKKworLmRlcGVuZCBhbGw6CisJQGZvciBkaXIgaW4gJChTVUJESVJTKSA7IGRvIFwKKwkJJChNQUtFKSAtQyAkJGRpciAkQCA7IGRvbmUKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL2ZhdC9NYWtlZmlsZSBiL3gtbG9hZGVyL2ZzL2ZhdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44N2FmNzNiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvZnMvZmF0L01ha2VmaWxlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYmZhdC5hCisKK0FPQkpTCT0KK0NPQkpTCT0gZmF0Lm8gZmlsZS5vCisKK1NSQ1MJOj0gJChBT0JKUzoubz0uUykgJChDT0JKUzoubz0uYykKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLCQoQU9CSlMpICQoQ09CSlMpKQorCithbGw6CSQoTElCKSAkKEFPQkpTKQorCiskKExJQik6CSQob2JqKS5kZXBlbmQgJChPQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpTKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9mcy9mYXQvZmF0LmMgYi94LWxvYWRlci9mcy9mYXQvZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTM2Mzg4MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2ZzL2ZhdC9mYXQuYwpAQCAtMCwwICsxLDkyOCBAQAorLyoKKyAqIGZhdC5jCisgKgorICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZworICoKKyAqIDIwMDItMDctMjggLSByam9uZXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gcHBjYm9vdCB2MS4xLjYKKyAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHVib290CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZmRlZiBDRkdfQ01EX0ZBVAorCisvKgorICogQ29udmVydCBhIHN0cmluZyB0byBsb3dlcmNhc2UuCisgKi8KK3N0YXRpYyB2b2lkCitkb3duY2FzZShjaGFyICpzdHIpCit7CisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlUT0xPV0VSKCpzdHIpOworCQlzdHIrKzsKKwl9Cit9CisKK3N0YXRpYyAgYmxvY2tfZGV2X2Rlc2NfdCAqY3VyX2RldiA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJ0X29mZnNldCA9IDA7CitzdGF0aWMgaW50IGN1cl9wYXJ0ID0gMTsKKworI2RlZmluZSBET1NfUEFSVF9UQkxfT0ZGU0VUCTB4MWJlCisjZGVmaW5lIERPU19QQVJUX01BR0lDX09GRlNFVAkweDFmZQorI2RlZmluZSBET1NfRlNfVFlQRV9PRkZTRVQJMHg1MgorCitpbnQgc3RybmNtcChjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0LHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgcmVnaXN0ZXIgc2lnbmVkIGNoYXIgX19yZXMgPSAwOworCisgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgIGlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjb3VudC0tOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIF9fcmVzOworfQorCitjaGFyICogc3RyY3B5KGNoYXIgKiBkZXN0LGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICAgICAgY2hhciAqdG1wID0gZGVzdDsKKworICAgICAgICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisgICAgICAgICAgICAgICAgLyogbm90aGluZyAqLzsKKyAgICAgICAgcmV0dXJuIHRtcDsKK30KKworaW50IHN0cmNtcChjb25zdCBjaGFyICogY3MsY29uc3QgY2hhciAqIGN0KQoreworICAgICAgICByZWdpc3RlciBzaWduZWQgY2hhciBfX3JlczsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgIGlmICgoX19yZXMgPSAqY3MgLSAqY3QrKykgIT0gMCB8fCAhKmNzKyspCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBfX3JlczsKK30KK3ZvaWQgKiBtZW1jcHkodm9pZCAqIGRlc3QsY29uc3Qgdm9pZCAqc3JjLHNpemVfdCBjb3VudCkKK3sKKyAgICAgICAgY2hhciAqdG1wID0gKGNoYXIgKikgZGVzdCwgKnMgPSAoY2hhciAqKSBzcmM7CisKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pCisgICAgICAgICAgICAgICAgKnRtcCsrID0gKnMrKzsKKworICAgICAgICByZXR1cm4gZGVzdDsKK30KKworCitpbnQgZGlza19yZWFkIChfX3UzMiBzdGFydGJsb2NrLCBfX3UzMiBnZXRzaXplLCBfX3U4ICogYnVmcHRyKQoreworCXN0YXJ0YmxvY2sgKz0gcGFydF9vZmZzZXQ7CisJaWYgKGN1cl9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChjdXJfZGV2LT5ibG9ja19yZWFkKSB7CisJCXJldHVybiBjdXJfZGV2LT5ibG9ja19yZWFkIChjdXJfZGV2LT5kZXYsIHN0YXJ0YmxvY2ssIGdldHNpemUsICh1bnNpZ25lZCBsb25nICopYnVmcHRyKTsKKwl9CisJcmV0dXJuIC0xOworfQorCisKK2ludAorZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnRfbm8pCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbU0VDVE9SX1NJWkVdOworCisJaWYgKCFkZXZfZGVzYy0+YmxvY2tfcmVhZCkKKwkJcmV0dXJuIC0xOworCWN1cl9kZXY9ZGV2X2Rlc2M7CisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIE1CUiAob24gZmxvcHBpZXMgd2UgaGF2ZSBvbmx5IGEgUEJSKSAqLworCWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZCAoZGV2X2Rlc2MtPmRldiwgMCwgMSwgKHVsb25nICopIGJ1ZmZlcikgIT0gMSkgeworCQlwcmludGYgKCIqKiBDYW4ndCByZWFkIGZyb20gZGV2aWNlICVkICoqXG4iLCBkZXZfZGVzYy0+ZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoYnVmZmVyW0RPU19QQVJUX01BR0lDX09GRlNFVF0gIT0gMHg1NSB8fAorCQlidWZmZXJbRE9TX1BBUlRfTUFHSUNfT0ZGU0VUICsgMV0gIT0gMHhhYSkgeworCQkvKiBubyBzaWduYXR1cmUgZm91bmQgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlpZighc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwiRkFUIiwzKSkgeworCQkvKiBvaywgd2UgYXNzdW1lIHdlIGFyZSBvbiBhIFBCUiBvbmx5ICovCisJCWN1cl9wYXJ0ID0gMTsKKwkJcGFydF9vZmZzZXQ9MDsKKwl9CisJZWxzZSB7CisjaWYgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfSURFKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9TQ1NJKSB8fCBcCisgICAgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfVVNCKSB8fCAoQ09ORklHX0NPTU1BTkRTICYgQ0ZHX0NNRF9NTUMpIHx8IGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkKKwkJZGlza19wYXJ0aXRpb25fdCBpbmZvOworCQlpZighZ2V0X3BhcnRpdGlvbl9pbmZvKGRldl9kZXNjLCBwYXJ0X25vLCAmaW5mbykpIHsKKwkJCXBhcnRfb2Zmc2V0ID0gaW5mby5zdGFydDsKKwkJCWN1cl9wYXJ0ID0gcGFydF9ubzsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ZiAoIioqIFBhcnRpdGlvbiAlZCBub3QgdmFsaWQgb24gZGV2aWNlICVkICoqXG4iLHBhcnRfbm8sZGV2X2Rlc2MtPmRldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbHNlCisJCS8qIEZJWE1FIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFydCBibG9jayBvZiB0aGUKKwkJICogcGFydGl0aW9uIHdoZXJlIHRoZSBET1MgRlMgcmVzaWRlcy4gVGhpcyBjYW4gYmUgZG9uZQorCQkgKiBieSB1c2luZyB0aGUgZ2V0X3BhcnRpdGlvbl9pbmZvIHJvdXRpbmUuIEZvciB0aGlzCisJCSAqIHB1cnBvc2UgdGhlIGxpYnBhcnQgbXVzdCBiZSBpbmNsdWRlZC4KKwkJICovCisJCXBhcnRfb2Zmc2V0PTYzOworCQkvL3BhcnRfb2Zmc2V0PTA7CisJCWN1cl9wYXJ0ID0gMTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICogR2V0IHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgYSBkaXJlY3RvcnkgZGVsaW1pdGVyICgnLycgb3IgJ1wnKSBpbiBhIHN0cmluZy4KKyAqIFJldHVybiBpbmRleCBpbnRvIHN0cmluZyBpZiBmb3VuZCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CitkaXJkZWxpbShjaGFyICpzdHIpCit7CisJY2hhciAqc3RhcnQgPSBzdHI7CisKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCWlmIChJU0RJUkRFTElNKCpzdHIpKSByZXR1cm4gc3RyIC0gc3RhcnQ7CisJCXN0cisrOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIE1hdGNoIHZvbHVtZV9pbmZvIGZzX3R5cGUgc3RyaW5ncy4KKyAqIFJldHVybiAwIG9uIG1hdGNoLCAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2NvbXBhcmVfc2lnbihjaGFyICpzdHIxLCBjaGFyICpzdHIyKQoreworCWNoYXIgKmVuZCA9IHN0cjErU0lHTkxFTjsKKworCXdoaWxlIChzdHIxICE9IGVuZCkgeworCQlpZiAoKnN0cjEgIT0gKnN0cjIpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzdHIxKys7CisJCXN0cjIrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogRXh0cmFjdCB6ZXJvIHRlcm1pbmF0ZWQgc2hvcnQgbmFtZSBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgdm9pZCBnZXRfbmFtZSAoZGlyX2VudHJ5ICpkaXJlbnQsIGNoYXIgKnNfbmFtZSkKK3sKKwljaGFyICpwdHI7CisKKwltZW1jcHkgKHNfbmFtZSwgZGlyZW50LT5uYW1lLCA4KTsKKwlzX25hbWVbOF0gPSAnXDAnOworCXB0ciA9IHNfbmFtZTsKKwl3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKKwkJcHRyKys7CisJaWYgKGRpcmVudC0+ZXh0WzBdICYmIGRpcmVudC0+ZXh0WzBdICE9ICcgJykgeworCQkqcHRyID0gJy4nOworCQlwdHIrKzsKKwkJbWVtY3B5IChwdHIsIGRpcmVudC0+ZXh0LCAzKTsKKwkJcHRyWzNdID0gJ1wwJzsKKwkJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCisJCQlwdHIrKzsKKwl9CisJKnB0ciA9ICdcMCc7CisJaWYgKCpzX25hbWUgPT0gREVMRVRFRF9GTEFHKQorCQkqc19uYW1lID0gJ1wwJzsKKwllbHNlIGlmICgqc19uYW1lID09IGFSSU5HKQorCQkqc19uYW1lID0gJ+UnOworCWRvd25jYXNlIChzX25hbWUpOworfQorCisvKgorICogR2V0IHRoZSBlbnRyeSBhdCBpbmRleCAnZW50cnknIGluIGEgRkFUICgxMi8xNi8zMikgdGFibGUuCisgKiBPbiBmYWlsdXJlIDB4MDAgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBfX3UzMgorZ2V0X2ZhdGVudChmc2RhdGEgKm15ZGF0YSwgX191MzIgZW50cnkpCit7CisJX191MzIgYnVmbnVtOworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiByZXQgPSAweDAwOworCisJc3dpdGNoIChteWRhdGEtPmZhdHNpemUpIHsKKwljYXNlIDMyOgorCQlidWZudW0gPSBlbnRyeSAvIEZBVDMyQlVGU0laRTsKKwkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQzMkJVRlNJWkU7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMTZCVUZTSVpFOworCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDE2QlVGU0laRTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJYnVmbnVtID0gZW50cnkgLyBGQVQxMkJVRlNJWkU7CisJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMTJCVUZTSVpFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFVuc3VwcG9ydGVkIEZBVCBzaXplICovCisJCXJldHVybiByZXQ7CisJfQorCS8qIFJlYWQgYSBuZXcgYmxvY2sgb2YgRkFUIGVudHJpZXMgaW50byB0aGUgY2FjaGUuICovCisJaWYgKGJ1Zm51bSAhPSBteWRhdGEtPmZhdGJ1Zm51bSkgeworCQlpbnQgZ2V0c2l6ZSA9IEZBVEJVRlNJWkUvRlNfQkxPQ0tfU0laRTsKKwkJX191OCAqYnVmcHRyID0gKF9fdTggKilteWRhdGEtPmZhdGJ1ZjsKKwkJX191MzIgZmF0bGVuZ3RoID0gbXlkYXRhLT5mYXRsZW5ndGg7CisJCV9fdTMyIHN0YXJ0YmxvY2sgPSBidWZudW0gKiBGQVRCVUZCTE9DS1M7CisKKwkJZmF0bGVuZ3RoICo9IFNFQ1RPUl9TSVpFOwkvKiBXZSB3YW50IGl0IGluIGJ5dGVzIG5vdyAqLworCQlzdGFydGJsb2NrICs9IG15ZGF0YS0+ZmF0X3NlY3Q7CS8qIE9mZnNldCBmcm9tIHN0YXJ0IG9mIGRpc2sgKi8KKworCQlpZiAoZ2V0c2l6ZSA+IGZhdGxlbmd0aCkgZ2V0c2l6ZSA9IGZhdGxlbmd0aDsKKwkJaWYgKGRpc2tfcmVhZChzdGFydGJsb2NrLCBnZXRzaXplLCBidWZwdHIpIDwgMCkgeworCQkJRkFUX0RQUklOVCgiRXJyb3IgcmVhZGluZyBGQVQgYmxvY2tzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbXlkYXRhLT5mYXRidWZudW0gPSBidWZudW07CisJfQorCisJLyogR2V0IHRoZSBhY3R1YWwgZW50cnkgZnJvbSB0aGUgdGFibGUgKi8KKwlzd2l0Y2ggKG15ZGF0YS0+ZmF0c2l6ZSkgeworCWNhc2UgMzI6CisJCXJldCA9IEZBVDJDUFUzMigoKF9fdTMyKilteWRhdGEtPmZhdGJ1Zilbb2Zmc2V0XSk7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2Zmc2V0XSk7CisJCWJyZWFrOworCWNhc2UgMTI6IHsKKwkJX191MzIgb2ZmMTYgPSAob2Zmc2V0KjMpLzQ7CisJCV9fdTE2IHZhbDEsIHZhbDI7CisKKwkJc3dpdGNoIChvZmZzZXQgJiAweDMpIHsKKwkJY2FzZSAwOgorCQkJcmV0ID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOworCQkJcmV0ICY9IDB4ZmZmOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXZhbDEgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CisJCQl2YWwxICY9IDB4ZjAwMDsKKwkJCXZhbDIgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2KzFdKTsKKwkJCXZhbDIgJj0gMHgwMGZmOworCQkJcmV0ID0gKHZhbDIgPDwgNCkgfCAodmFsMSA+PiAxMik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdmFsMSA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKKwkJCXZhbDEgJj0gMHhmZjAwOworCQkJdmFsMiA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTYrMV0pOworCQkJdmFsMiAmPSAweDAwMGY7CisJCQlyZXQgPSAodmFsMiA8PCA4KSB8ICh2YWwxID4+IDgpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXJldCA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTs7CisJCQlyZXQgPSAocmV0ICYgMHhmZmYwKSA+PiA0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVhazsKKwl9CisJRkFUX0RQUklOVCgicmV0OiAlZCwgb2Zmc2V0OiAlZFxuIiwgcmV0LCBvZmZzZXQpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogUmVhZCBhdCBtb3N0ICdzaXplJyBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgY2x1c3RlciBpbnRvICdidWZmZXInLgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CitnZXRfY2x1c3Rlcihmc2RhdGEgKm15ZGF0YSwgX191MzIgY2x1c3RudW0sIF9fdTggKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBpZHggPSAwOworCV9fdTMyIHN0YXJ0c2VjdDsKKworCWlmIChjbHVzdG51bSA+IDApIHsKKwkJc3RhcnRzZWN0ID0gbXlkYXRhLT5kYXRhX2JlZ2luICsgY2x1c3RudW0qbXlkYXRhLT5jbHVzdF9zaXplOworCX0gZWxzZSB7CisJCXN0YXJ0c2VjdCA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0OworCX0KKworCWlmIChkaXNrX3JlYWQoc3RhcnRzZWN0LCBzaXplL0ZTX0JMT0NLX1NJWkUgLCBidWZmZXIpIDwgMCkgeworCQlGQVRfRFBSSU5UKCJFcnJvciByZWFkaW5nIGRhdGFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmKHNpemUgJSBGU19CTE9DS19TSVpFKSB7CisJCV9fdTggdG1wYnVmW0ZTX0JMT0NLX1NJWkVdOworCQlpZHg9IHNpemUvRlNfQkxPQ0tfU0laRTsKKwkJaWYgKGRpc2tfcmVhZChzdGFydHNlY3QgKyBpZHgsIDEsIHRtcGJ1ZikgPCAwKSB7CisJCQlGQVRfRFBSSU5UKCJFcnJvciByZWFkaW5nIGRhdGFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ1ZmZlciArPSBpZHgqRlNfQkxPQ0tfU0laRTsKKworCQltZW1jcHkoYnVmZmVyLCB0bXBidWYsIHNpemUgJSBGU19CTE9DS19TSVpFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJlYWQgYXQgbW9zdCAnbWF4c2l6ZScgYnl0ZXMgZnJvbSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggJ2RlbnRwdHInCisgKiBpbnRvICdidWZmZXInLgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBvbiBmYXRhbCBlcnJvcnMuCisgKi8KK3N0YXRpYyBsb25nCitnZXRfY29udGVudHMoZnNkYXRhICpteWRhdGEsIGRpcl9lbnRyeSAqZGVudHB0ciwgX191OCAqYnVmZmVyLAorCSAgICAgdW5zaWduZWQgbG9uZyBtYXhzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmlsZXNpemUgPSBGQVQyQ1BVMzIoZGVudHB0ci0+c2l6ZSksIGdvdHNpemUgPSAwOworCXVuc2lnbmVkIGludCBieXRlc3BlcmNsdXN0ID0gbXlkYXRhLT5jbHVzdF9zaXplICogU0VDVE9SX1NJWkU7CisJX191MzIgY3VyY2x1c3QgPSBTVEFSVChkZW50cHRyKTsKKwlfX3UzMiBlbmRjbHVzdCwgbmV3Y2x1c3Q7CisJdW5zaWduZWQgbG9uZyBhY3RzaXplOworCisJRkFUX0RQUklOVCgiRmlsZXNpemU6ICVsZCBieXRlc1xuIiwgZmlsZXNpemUpOworCisJaWYgKG1heHNpemUgPiAwICYmIGZpbGVzaXplID4gbWF4c2l6ZSkgZmlsZXNpemUgPSBtYXhzaXplOworCisJRkFUX0RQUklOVCgiUmVhZGluZzogJWxkIGJ5dGVzXG4iLCBmaWxlc2l6ZSk7CisKKwlhY3RzaXplPWJ5dGVzcGVyY2x1c3Q7CisJZW5kY2x1c3Q9Y3VyY2x1c3Q7CisJZG8geworCQkvKiBzZWFyY2ggZm9yIGNvbnNlY3V0aXZlIGNsdXN0ZXJzICovCisJCXdoaWxlKGFjdHNpemUgPCBmaWxlc2l6ZSkgeworCQkJbmV3Y2x1c3QgPSBnZXRfZmF0ZW50KG15ZGF0YSwgZW5kY2x1c3QpOworCQkJaWYoKG5ld2NsdXN0IC0xKSE9ZW5kY2x1c3QpCisJCQkJZ290byBnZXRpdDsKKwkJCWlmIChuZXdjbHVzdCA8PSAweDAwMDEgfHwgbmV3Y2x1c3QgPj0gMHhmZmYwKSB7CisJCQkJRkFUX0RQUklOVCgiY3VyY2x1c3Q6IDB4JXhcbiIsIG5ld2NsdXN0KTsKKwkJCQlGQVRfRFBSSU5UKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CisJCQkJcmV0dXJuIGdvdHNpemU7CisJCQl9CisJCQllbmRjbHVzdD1uZXdjbHVzdDsKKwkJCWFjdHNpemUrPSBieXRlc3BlcmNsdXN0OworCQl9CisJCS8qIGFjdHNpemUgPj0gZmlsZSBzaXplICovCisJCWFjdHNpemUgLT0gYnl0ZXNwZXJjbHVzdDsKKwkJLyogZ2V0IHJlbWFpbmluZyBjbHVzdGVycyAqLworCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBjdXJjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKKwkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBnZXQgcmVtYWluaW5nIGJ5dGVzICovCisJCWdvdHNpemUgKz0gKGludClhY3RzaXplOworCQlmaWxlc2l6ZSAtPSBhY3RzaXplOworCQlidWZmZXIgKz0gYWN0c2l6ZTsKKwkJYWN0c2l6ZT0gZmlsZXNpemU7CisJCWlmIChnZXRfY2x1c3RlcihteWRhdGEsIGVuZGNsdXN0LCBidWZmZXIsIChpbnQpYWN0c2l6ZSkgIT0gMCkgeworCQkJRkFUX0VSUk9SKCJFcnJvciByZWFkaW5nIGNsdXN0ZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWdvdHNpemUrPWFjdHNpemU7CisJCXJldHVybiBnb3RzaXplOworZ2V0aXQ6CisJCWlmIChnZXRfY2x1c3RlcihteWRhdGEsIGN1cmNsdXN0LCBidWZmZXIsIChpbnQpYWN0c2l6ZSkgIT0gMCkgeworCQkJRkFUX0VSUk9SKCJFcnJvciByZWFkaW5nIGNsdXN0ZXJcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWdvdHNpemUgKz0gKGludClhY3RzaXplOworCQlmaWxlc2l6ZSAtPSBhY3RzaXplOworCQlidWZmZXIgKz0gYWN0c2l6ZTsKKwkJY3VyY2x1c3QgPSBnZXRfZmF0ZW50KG15ZGF0YSwgZW5kY2x1c3QpOworCQlpZiAoY3VyY2x1c3QgPD0gMHgwMDAxIHx8IGN1cmNsdXN0ID49IDB4ZmZmMCkgeworCQkJRkFUX0RQUklOVCgiY3VyY2x1c3Q6IDB4JXhcbiIsIGN1cmNsdXN0KTsKKwkJCUZBVF9FUlJPUigiSW52YWxpZCBGQVQgZW50cnlcbiIpOworCQkJcmV0dXJuIGdvdHNpemU7CisJCX0KKwkJYWN0c2l6ZT1ieXRlc3BlcmNsdXN0OworCQllbmRjbHVzdD1jdXJjbHVzdDsKKwl9IHdoaWxlICgxKTsKK30KKworCisjaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAorI2lmIDAKKy8qCisgKiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUgaW5mb3JtYXRpb24gZnJvbSAnc2xvdHB0cicgaW50byAnbF9uYW1lJywKKyAqIHN0YXJ0aW5nIGF0IGxfbmFtZVsqaWR4XS4KKyAqIFJldHVybiAxIGlmIHRlcm1pbmF0b3IgKHplcm8gYnl0ZSkgaXMgZm91bmQsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CitzbG90MnN0cihkaXJfc2xvdCAqc2xvdHB0ciwgY2hhciAqbF9uYW1lLCBpbnQgKmlkeCkKK3sKKwlpbnQgajsKKworCWZvciAoaiA9IDA7IGogPD0gODsgaiArPSAyKSB7CisJCWxfbmFtZVsqaWR4XSA9IHNsb3RwdHItPm5hbWUwXzRbal07CisJCWlmIChsX25hbWVbKmlkeF0gPT0gMHgwMCkgcmV0dXJuIDE7CisJCSgqaWR4KSsrOworCX0KKwlmb3IgKGogPSAwOyBqIDw9IDEwOyBqICs9IDIpIHsKKwkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTVfMTBbal07CisJCWlmIChsX25hbWVbKmlkeF0gPT0gMHgwMCkgcmV0dXJuIDE7CisJCSgqaWR4KSsrOworCX0KKwlmb3IgKGogPSAwOyBqIDw9IDI7IGogKz0gMikgeworCQlsX25hbWVbKmlkeF0gPSBzbG90cHRyLT5uYW1lMTFfMTJbal07CisJCWlmIChsX25hbWVbKmlkeF0gPT0gMHgwMCkgcmV0dXJuIDE7CisJCSgqaWR4KSsrOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisvKiBDYWxjdWxhdGUgc2hvcnQgbmFtZSBjaGVja3N1bSAqLworc3RhdGljIF9fdTgKK21rY2tzdW0oY29uc3QgY2hhciAqc3RyKQoreworCWludCBpOworCV9fdTggcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSB7CisJCXJldCA9ICgoKHJldCYxKTw8Nyl8KChyZXQmMHhmZSk+PjEpKSArIHN0cltpXTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKKworLyoKKyAqIEdldCB0aGUgZGlyZWN0b3J5IGVudHJ5IGFzc29jaWF0ZWQgd2l0aCAnZmlsZW5hbWUnIGZyb20gdGhlIGRpcmVjdG9yeQorICogc3RhcnRpbmcgYXQgJ3N0YXJ0c2VjdCcKKyAqLworCisKK3N0YXRpYyBkaXJfZW50cnkgKmdldF9kZW50ZnJvbWRpciAoZnNkYXRhICogbXlkYXRhLCBpbnQgc3RhcnRzZWN0LAorCQkJCSAgIGNoYXIgKmZpbGVuYW1lLCBkaXJfZW50cnkgKiByZXRkZW50LAorCQkJCSAgIGludCBkb2xzKQoreworCXJldHVybiBOVUxMOworfQorCisjaWYgMAorX191OCBnZXRfZGVudGZyb21kaXJfYmxvY2tbTUFYX0NMVVNUU0laRV07CitzdGF0aWMgZGlyX2VudHJ5ICpnZXRfZGVudGZyb21kaXIgKGZzZGF0YSAqIG15ZGF0YSwgaW50IHN0YXJ0c2VjdCwKKwkJCQkgICBjaGFyICpmaWxlbmFtZSwgZGlyX2VudHJ5ICogcmV0ZGVudCwKKwkJCQkgICBpbnQgZG9scykKK3sKKyAgICBfX3UxNiBwcmV2Y2tzdW0gPSAweGZmZmY7CisgICAgX191MzIgY3VyY2x1c3QgPSBTVEFSVCAocmV0ZGVudCk7CisgICAgaW50IGZpbGVzID0gMCwgZGlycyA9IDA7CisKKyAgICB3aGlsZSAoMSkgeworCWRpcl9lbnRyeSAqZGVudHB0cjsKKwlpbnQgaTsKKworCWlmIChnZXRfY2x1c3RlciAobXlkYXRhLCBjdXJjbHVzdCwgZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrLAorCQkgbXlkYXRhLT5jbHVzdF9zaXplICogU0VDVE9SX1NJWkUpICE9IDApIHsKKwkgICAgRkFUX0RQUklOVCAoIkVycm9yOiByZWFkaW5nIGRpcmVjdG9yeSBibG9ja1xuIik7CisJICAgIHJldHVybiBOVUxMOworCX0KKwlkZW50cHRyID0gKGRpcl9lbnRyeSAqKSBnZXRfZGVudGZyb21kaXJfYmxvY2s7CisJZm9yIChpID0gMDsgaSA8IERJUkVOVFNQRVJDTFVTVDsgaSsrKSB7CisJICAgIGNoYXIgc19uYW1lWzE0XSwgbF9uYW1lWzI1Nl07CisKKwkgICAgbF9uYW1lWzBdID0gJ1wwJzsKKwkgICAgaWYgKGRlbnRwdHItPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKSB7CisJCSAgICBkZW50cHRyKys7CisJCSAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZPTFVNRSkpIHsKKwkJICAgIC8qIFZvbHVtZSBsYWJlbCBvciBWRkFUIGVudHJ5ICovCisJCSAgICBkZW50cHRyKys7CisJCSAgICBjb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoZGVudHB0ci0+bmFtZVswXSA9PSAwKSB7CisJCWlmIChkb2xzKSB7CisJCSAgICBwcmludGYgKCJcbiVkIGZpbGUocyksICVkIGRpcihzKVxuXG4iLCBmaWxlcywgZGlycyk7CisJCX0KKwkJRkFUX0RQUklOVCAoIkRlbnRuYW1lID09IE5VTEwgLSAlZFxuIiwgaSk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisjaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAorCSAgICBpZiAoZG9scyAmJiBta2Nrc3VtIChkZW50cHRyLT5uYW1lKSA9PSBwcmV2Y2tzdW0pIHsKKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisJICAgIGdldF9uYW1lIChkZW50cHRyLCBzX25hbWUpOworCSAgICBpZiAoZG9scykgeworCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKKwkJY2hhciBkaXJjOworCQlpbnQgZG9pdCA9IDA7CisKKwkJaWYgKGlzZGlyKSB7CisJCSAgICBkaXJzKys7CisJCSAgICBkaXJjID0gJy8nOworCQkgICAgZG9pdCA9IDE7CisJCX0gZWxzZSB7CisJCSAgICBkaXJjID0gJyAnOworCQkgICAgaWYgKHNfbmFtZVswXSAhPSAwKSB7CisJCQlmaWxlcysrOworCQkJZG9pdCA9IDE7CisJCSAgICB9CisJCX0KKwkJaWYgKGRvaXQpIHsKKwkJICAgIGlmIChkaXJjID09ICcgJykgeworCQkJcHJpbnRmICgiICU4bGQgICAlcyVjXG4iLAorCQkJCShsb25nKSBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCBzX25hbWUsCisJCQkJZGlyYyk7CisJCSAgICB9IGVsc2UgeworCQkJcHJpbnRmICgiICAgICAgICAgICAgJXMlY1xuIiwgc19uYW1lLCBkaXJjKTsKKwkJICAgIH0KKwkJfQorCQlkZW50cHRyKys7CisJCWNvbnRpbnVlOworCSAgICB9CisJICAgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCBzX25hbWUpICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxfbmFtZSkpIHsKKwkJRkFUX0RQUklOVCAoIk1pc21hdGNoOiB8JXN8JXN8XG4iLCBzX25hbWUsIGxfbmFtZSk7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgbWVtY3B5IChyZXRkZW50LCBkZW50cHRyLCBzaXplb2YgKGRpcl9lbnRyeSkpOworCisJICAgIEZBVF9EUFJJTlQgKCJEZW50TmFtZTogJXMiLCBzX25hbWUpOworCSAgICBGQVRfRFBSSU5UICgiLCBzdGFydDogMHgleCIsIFNUQVJUIChkZW50cHRyKSk7CisJICAgIEZBVF9EUFJJTlQgKCIsIHNpemU6ICAweCV4ICVzXG4iLAorCQkJRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwKKwkJCShkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpID8gIihESVIpIiA6ICIiKTsKKworCSAgICByZXR1cm4gcmV0ZGVudDsKKwl9CisJY3VyY2x1c3QgPSBnZXRfZmF0ZW50IChteWRhdGEsIGN1cmNsdXN0KTsKKwlpZiAoY3VyY2x1c3QgPD0gMHgwMDAxIHx8IGN1cmNsdXN0ID49IDB4ZmZmMCkgeworCSAgICBGQVRfRFBSSU5UICgiY3VyY2x1c3Q6IDB4JXhcbiIsIGN1cmNsdXN0KTsKKwkgICAgRkFUX0VSUk9SICgiSW52YWxpZCBGQVQgZW50cnlcbiIpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworCisvKgorICogUmVhZCBib290IHNlY3RvciBhbmQgdm9sdW1lIGluZm8gZnJvbSBhIEZBVCBmaWxlc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQKK3JlYWRfYm9vdHNlY3RhbmR2aShib290X3NlY3RvciAqYnMsIHZvbHVtZV9pbmZvICp2b2xpbmZvLCBpbnQgKmZhdHNpemUpCit7CisJX191OCBibG9ja1tGU19CTE9DS19TSVpFXTsKKwl2b2x1bWVfaW5mbyAqdmlzdGFydDsKKworCXByaW50ZigiUmVhZGluZyBib290IHNlY3RvclxuIik7CisKKwlpZiAoZGlza19yZWFkKDAsIDEsIGJsb2NrKSA8IDApIHsKKwkJRkFUX0RQUklOVCgiRXJyb3I6IHJlYWRpbmcgYmxvY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWVtY3B5KGJzLCBibG9jaywgc2l6ZW9mKGJvb3Rfc2VjdG9yKSk7CisJYnMtPnJlc2VydmVkCT0gRkFUMkNQVTE2KGJzLT5yZXNlcnZlZCk7CisJYnMtPmZhdF9sZW5ndGgJPSBGQVQyQ1BVMTYoYnMtPmZhdF9sZW5ndGgpOworCWJzLT5zZWNzX3RyYWNrCT0gRkFUMkNQVTE2KGJzLT5zZWNzX3RyYWNrKTsKKwlicy0+aGVhZHMJPSBGQVQyQ1BVMTYoYnMtPmhlYWRzKTsKKyNpZiAwIC8qIFVOVVNFRCAqLworCWJzLT5oaWRkZW4JPSBGQVQyQ1BVMzIoYnMtPmhpZGRlbik7CisjZW5kaWYKKwlicy0+dG90YWxfc2VjdAk9IEZBVDJDUFUzMihicy0+dG90YWxfc2VjdCk7CisKKwkvKiBGQVQzMiBlbnRyaWVzICovCisJaWYgKGJzLT5mYXRfbGVuZ3RoID09IDApIHsKKwkJLyogQXNzdW1lIEZBVDMyICovCisJCWJzLT5mYXQzMl9sZW5ndGggPSBGQVQyQ1BVMzIoYnMtPmZhdDMyX2xlbmd0aCk7CisJCWJzLT5mbGFncwkgPSBGQVQyQ1BVMTYoYnMtPmZsYWdzKTsKKwkJYnMtPnJvb3RfY2x1c3RlciA9IEZBVDJDUFUzMihicy0+cm9vdF9jbHVzdGVyKTsKKwkJYnMtPmluZm9fc2VjdG9yICA9IEZBVDJDUFUxNihicy0+aW5mb19zZWN0b3IpOworCQlicy0+YmFja3VwX2Jvb3QgID0gRkFUMkNQVTE2KGJzLT5iYWNrdXBfYm9vdCk7CisJCXZpc3RhcnQgPSAodm9sdW1lX2luZm8qKSAoYmxvY2sgKyBzaXplb2YoYm9vdF9zZWN0b3IpKTsKKwkJKmZhdHNpemUgPSAzMjsKKwl9IGVsc2UgeworCQl2aXN0YXJ0ID0gKHZvbHVtZV9pbmZvKikgJihicy0+ZmF0MzJfbGVuZ3RoKTsKKwkJKmZhdHNpemUgPSAwOworCX0KKwltZW1jcHkodm9saW5mbywgdmlzdGFydCwgc2l6ZW9mKHZvbHVtZV9pbmZvKSk7CisKKwkvKiBUZXJtaW5hdGUgZnNfdHlwZSBzdHJpbmcuIFdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHZpc3RhcnQKKwkgICBpcyBvayAtIGl0J3MganVzdCB0aGUgYnVmZmVyLiAqLworCXZpc3RhcnQtPmZzX3R5cGVbN10gPSAnXDAnOworCisJaWYgKCpmYXRzaXplID09IDMyKSB7CisJCWlmIChjb21wYXJlX3NpZ24oRkFUMzJfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29tcGFyZV9zaWduKEZBVDEyX1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKKwkJCSpmYXRzaXplID0gMTI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY29tcGFyZV9zaWduKEZBVDE2X1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKKwkJCSpmYXRzaXplID0gMTY7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCUZBVF9EUFJJTlQoIkVycm9yOiBicm9rZW4gZnNfdHlwZSBzaWduXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKyNpZiAwCitfX3U4IGRvX2ZhdF9yZWFkX2Jsb2NrW01BWF9DTFVTVFNJWkVdOyAgLyogQmxvY2sgYnVmZmVyICovCisjZW5kaWYKKworX191OCAqZm5hbWVjb3B5ID0gKF9fdTggKikweDgwNTAwMDAwOworX191OCAqZG9fZmF0X3JlYWRfYmxvY2sgPSAoX191OCAqKTB4ODA1MDA4ODA7CisKK2Jvb3Rfc2VjdG9yIGJzOwordm9sdW1lX2luZm8gdm9saW5mbzsKK2ZzZGF0YSBkYXRhYmxvY2s7CisKK2xvbmcKK2RvX2ZhdF9yZWFkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgbWF4c2l6ZSwKKwkgICAgIGludCBkb2xzKQoreworI2lmIENPTkZJR19OSU9TIC8qIE5JT1MgQ1BVIGNhbm5vdCBhY2Nlc3MgYmlnIGF1dG9tYXRpYyBhcnJheXMgKi8KKyAgICBzdGF0aWMKKyNlbmRpZgorICAgIGZzZGF0YSAqbXlkYXRhID0gJmRhdGFibG9jazsKKyAgICBkaXJfZW50cnkgKmRlbnRwdHI7CisgICAgX191MTYgcHJldmNrc3VtID0gMHhmZmZmOworICAgIGNoYXIgKnN1Ym5hbWUgPSAiIjsKKyAgICBpbnQgcm9vdGRpcl9zaXplLCBjdXJzZWN0OworICAgIGludCBpZHgsIGlzZGlyID0gMDsKKyAgICBpbnQgZmlsZXMgPSAwLCBkaXJzID0gMDsKKyAgICBsb25nIHJldCA9IDA7CisgICAgaW50IGZpcnN0dGltZTsKKworICAgIGlmIChyZWFkX2Jvb3RzZWN0YW5kdmkgKCZicywgJnZvbGluZm8sICZteWRhdGEtPmZhdHNpemUpKSB7CisJcHJpbnRmICgiRXJyb3I6IHJlYWRpbmcgYm9vdCBzZWN0b3JcbiIpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG15ZGF0YS0+ZmF0c2l6ZSA9PSAzMikgeworCW15ZGF0YS0+ZmF0bGVuZ3RoID0gYnMuZmF0MzJfbGVuZ3RoOworICAgIH0gZWxzZSB7CisJbXlkYXRhLT5mYXRsZW5ndGggPSBicy5mYXRfbGVuZ3RoOworICAgIH0KKyAgICBteWRhdGEtPmZhdF9zZWN0ID0gYnMucmVzZXJ2ZWQ7CisgICAgY3Vyc2VjdCA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0CisJICAgID0gbXlkYXRhLT5mYXRfc2VjdCArIG15ZGF0YS0+ZmF0bGVuZ3RoICogYnMuZmF0czsKKyAgICBteWRhdGEtPmNsdXN0X3NpemUgPSBicy5jbHVzdGVyX3NpemU7CisgICAgaWYgKG15ZGF0YS0+ZmF0c2l6ZSA9PSAzMikgeworCXJvb3RkaXJfc2l6ZSA9IG15ZGF0YS0+Y2x1c3Rfc2l6ZTsKKwlteWRhdGEtPmRhdGFfYmVnaW4gPSBteWRhdGEtPnJvb3RkaXJfc2VjdCAgIC8qICsgcm9vdGRpcl9zaXplICovCisJCS0gKG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIDIpOworICAgIH0gZWxzZSB7CisJcm9vdGRpcl9zaXplID0gKChicy5kaXJfZW50cmllc1sxXSAqIChpbnQpIDI1NiArIGJzLmRpcl9lbnRyaWVzWzBdKQorCQkJKiBzaXplb2YgKGRpcl9lbnRyeSkpIC8gU0VDVE9SX1NJWkU7CisJbXlkYXRhLT5kYXRhX2JlZ2luID0gbXlkYXRhLT5yb290ZGlyX3NlY3QgKyByb290ZGlyX3NpemUKKwkJLSAobXlkYXRhLT5jbHVzdF9zaXplICogMik7CisgICAgfQorICAgIG15ZGF0YS0+ZmF0YnVmbnVtID0gLTE7CisKKyAgICBGQVRfRFBSSU5UICgiRkFUJWQsIGZhdGxlbmd0aDogJWRcbiIsIG15ZGF0YS0+ZmF0c2l6ZSwKKwkJbXlkYXRhLT5mYXRsZW5ndGgpOworICAgIEZBVF9EUFJJTlQgKCJSb290ZGlyIGJlZ2lucyBhdCBzZWN0b3I6ICVkLCBvZmZzZXQ6ICV4LCBzaXplOiAlZFxuIgorCQkiRGF0YSBiZWdpbnMgYXQ6ICVkXG4iLAorCQlteWRhdGEtPnJvb3RkaXJfc2VjdCwgbXlkYXRhLT5yb290ZGlyX3NlY3QgKiBTRUNUT1JfU0laRSwKKwkJcm9vdGRpcl9zaXplLCBteWRhdGEtPmRhdGFfYmVnaW4pOworICAgIEZBVF9EUFJJTlQgKCJDbHVzdGVyIHNpemU6ICVkXG4iLCBteWRhdGEtPmNsdXN0X3NpemUpOworCisgICAgLyogImN3ZCIgaXMgYWx3YXlzIHRoZSByb290Li4uICovCisgICAgd2hpbGUgKElTRElSREVMSU0gKCpmaWxlbmFtZSkpCisJZmlsZW5hbWUrKzsKKyAgICAvKiBNYWtlIGEgY29weSBvZiB0aGUgZmlsZW5hbWUgYW5kIGNvbnZlcnQgaXQgdG8gbG93ZXJjYXNlICovCisgICAgc3RyY3B5KChjaGFyICopZm5hbWVjb3B5LCBmaWxlbmFtZSk7CisgICAgZG93bmNhc2UoKGNoYXIgKilmbmFtZWNvcHkpOworICAgIGlmICgqZm5hbWVjb3B5ID09ICdcMCcpIHsKKwlpZiAoIWRvbHMpeworCQlwcmludGYoIlxuIG5vdCB0aGVyZVxuIik7CisJICAgIHJldHVybiAtMTsKKwl9CisJZG9scyA9IExTX1JPT1Q7CisgICAgfSBlbHNlIGlmKChpZHggPSBkaXJkZWxpbSgoY2hhciAqKWZuYW1lY29weSkpID49IDApIHsKKwlpc2RpciA9IDE7CisJZm5hbWVjb3B5W2lkeF0gPSAnXDAnOworCXN1Ym5hbWUgPSAoY2hhciAqKWZuYW1lY29weSArIGlkeCArIDE7CisJLyogSGFuZGxlIG11bHRpcGxlIGRlbGltaXRlcnMgKi8KKwl3aGlsZSAoSVNESVJERUxJTSAoKnN1Ym5hbWUpKQorCSAgICBzdWJuYW1lKys7CisgICAgfSBlbHNlIGlmIChkb2xzKSB7CisJaXNkaXIgPSAxOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisJaW50IGk7CisKKwlpZiAoZGlza19yZWFkIChjdXJzZWN0LCBteWRhdGEtPmNsdXN0X3NpemUsIGRvX2ZhdF9yZWFkX2Jsb2NrKSA8IDApIHsKKwkgICAgcHJpbnRmICgiRXJyb3I6IHJlYWRpbmcgcm9vdGRpciBibG9ja1xuIik7CisJICAgIHJldHVybiAtMTsKKwl9CisJZGVudHB0ciA9IChkaXJfZW50cnkgKikgZG9fZmF0X3JlYWRfYmxvY2s7CisJZm9yIChpID0gMDsgaSA8IERJUkVOVFNQRVJCTE9DSzsgaSsrKSB7CisJICAgIGNoYXIgc19uYW1lWzE0XSwgbF9uYW1lWzI1Nl07CisKKwkgICAgbF9uYW1lWzBdID0gJ1wwJzsKKwkgICAgaWYgKChkZW50cHRyLT5hdHRyICYgQVRUUl9WT0xVTUUpKSB7CisJCSAgICAvKiBWb2x1bWUgbGFiZWwgb3IgVkZBVCBlbnRyeSAqLworCQkgICAgZGVudHB0cisrOworCQkgICAgY29udGludWU7CisJICAgIH0gZWxzZSBpZiAoZGVudHB0ci0+bmFtZVswXSA9PSAwKSB7CisJCUZBVF9EUFJJTlQgKCJSb290RGVudG5hbWUgPT0gTlVMTCAtICVkXG4iLCBpKTsKKwkJaWYgKGRvbHMgPT0gTFNfUk9PVCkgeworCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwgZmlsZXMsIGRpcnMpOworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC0xOworCSAgICB9CisjaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAorCSAgICBlbHNlIGlmIChkb2xzID09IExTX1JPT1QKKwkJICAgICAmJiBta2Nrc3VtIChkZW50cHRyLT5uYW1lKSA9PSBwcmV2Y2tzdW0pIHsKKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorI2VuZGlmCisJICAgIGdldF9uYW1lIChkZW50cHRyLCBzX25hbWUpOworCSAgICBpZiAoZG9scyA9PSBMU19ST09UKSB7CisJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOworCQljaGFyIGRpcmM7CisJCWludCBkb2l0ID0gMDsKKworCQlpZiAoaXNkaXIpIHsKKwkJICAgIGRpcmMgPSAnLyc7CisJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKKwkJCWRpcnMrKzsKKwkJCWRvaXQgPSAxOworCQkgICAgfQorCQl9IGVsc2UgeworCQkgICAgZGlyYyA9ICcgJzsKKwkJICAgIGlmIChzX25hbWVbMF0gIT0gMCkgeworCQkJZmlsZXMrKzsKKwkJCWRvaXQgPSAxOworCQkgICAgfQorCQl9CisJCWlmIChkb2l0KSB7CisJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKKwkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKKwkJCQkobG9uZykgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgc19uYW1lLAorCQkJCWRpcmMpOworCQkgICAgfSBlbHNlIHsKKwkJCXByaW50ZiAoIiAgICAgICAgICAgICVzJWNcbiIsIHNfbmFtZSwgZGlyYyk7CisJCSAgICB9CisJCX0KKwkJZGVudHB0cisrOworCQljb250aW51ZTsKKwkgICAgfQorCSAgICBpZiAoc3RyY21wKChjaGFyICopZm5hbWVjb3B5LCBzX25hbWUpICYmCisJCXN0cmNtcCgoY2hhciAqKWZuYW1lY29weSwgbF9uYW1lKSkgeworCQlGQVRfRFBSSU5UICgiUm9vdE1pc21hdGNoOiB8JXN8JXN8XG4iLCBzX25hbWUsIGxfbmFtZSk7CisJCWRlbnRwdHIrKzsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgaWYgKGlzZGlyICYmICEoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSkKKwkJcmV0dXJuIC0xOworCisJICAgIEZBVF9EUFJJTlQgKCJSb290TmFtZTogJXMiLCBzX25hbWUpOworCSAgICBGQVRfRFBSSU5UICgiLCBzdGFydDogMHgleCIsIFNUQVJUIChkZW50cHRyKSk7CisJICAgIEZBVF9EUFJJTlQgKCIsIHNpemU6ICAweCV4ICVzXG4iLAorCQkJRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwgaXNkaXIgPyAiKERJUikiIDogIiIpOworCisJICAgIGdvdG8gcm9vdGRpcl9kb25lOyAgLyogV2UgZ290IGEgbWF0Y2ggKi8KKwl9CisJY3Vyc2VjdCsrOworICAgIH0KKyAgcm9vdGRpcl9kb25lOgorCisgICAgZmlyc3R0aW1lID0gMTsKKyAgICB3aGlsZSAoaXNkaXIpIHsKKwlpbnQgc3RhcnRzZWN0ID0gbXlkYXRhLT5kYXRhX2JlZ2luCisJCSsgU1RBUlQgKGRlbnRwdHIpICogbXlkYXRhLT5jbHVzdF9zaXplOworCWRpcl9lbnRyeSBkZW50OworCWNoYXIgKm5leHRuYW1lID0gTlVMTDsKKworCWRlbnQgPSAqZGVudHB0cjsKKwlkZW50cHRyID0gJmRlbnQ7CisJaWR4ID0gZGlyZGVsaW0gKHN1Ym5hbWUpOworCWlmIChpZHggPj0gMCkgeworCSAgICBzdWJuYW1lW2lkeF0gPSAnXDAnOworCSAgICBuZXh0bmFtZSA9IHN1Ym5hbWUgKyBpZHggKyAxOworCSAgICAvKiBIYW5kbGUgbXVsdGlwbGUgZGVsaW1pdGVycyAqLworCSAgICB3aGlsZSAoSVNESVJERUxJTSAoKm5leHRuYW1lKSkKKwkJbmV4dG5hbWUrKzsKKwkgICAgaWYgKGRvbHMgJiYgKm5leHRuYW1lID09ICdcMCcpCisJCWZpcnN0dGltZSA9IDA7CisJfSBlbHNlIHsKKwkgICAgaWYgKGRvbHMgJiYgZmlyc3R0aW1lKSB7CisJCWZpcnN0dGltZSA9IDA7CisJICAgIH0gZWxzZSB7CisJCWlzZGlyID0gMDsKKwkgICAgfQorCX0KKworCWlmIChnZXRfZGVudGZyb21kaXIgKG15ZGF0YSwgc3RhcnRzZWN0LCBzdWJuYW1lLCBkZW50cHRyLAorCQkJICAgICBpc2RpciA/IDAgOiBkb2xzKSA9PSBOVUxMKSB7CisJICAgIGlmIChkb2xzICYmICFpc2RpcikKKwkJcmV0dXJuIDA7CisJICAgIHJldHVybiAtMTsKKwl9CisKKwlpZiAoaWR4ID49IDApIHsKKwkgICAgaWYgKCEoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSkKKwkJcmV0dXJuIC0xOworCSAgICBzdWJuYW1lID0gbmV4dG5hbWU7CisJfQorICAgIH0KKyAgICByZXQgPSBnZXRfY29udGVudHMgKG15ZGF0YSwgZGVudHB0ciwgYnVmZmVyLCBtYXhzaXplKTsKKyAgICBGQVRfRFBSSU5UICgiU2l6ZTogJWQsIGdvdDogJWxkXG4iLCBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitpbnQKK2ZpbGVfZmF0X2RldGVjdGZzKHZvaWQpCit7CisJYm9vdF9zZWN0b3IJYnM7CisJdm9sdW1lX2luZm8Jdm9saW5mbzsKKwlpbnQJCWZhdHNpemU7CisJY2hhcgl2b2xfbGFiZWxbMTJdOworCisJaWYoY3VyX2Rldj09TlVMTCkgeworCQlwcmludGYoIk5vIGN1cnJlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0lERSkgfHwgKENPTkZJR19DT01NQU5EUyAmIENGR19DTURfU0NTSSkgfHwgXAorICAgIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX1VTQikgfHwgKENPTkZJR19NTUMpCisJcHJpbnRmKCJJbnRlcmZhY2U6ICAiKTsKKwlzd2l0Y2goY3VyX2Rldi0+aWZfdHlwZSkgeworCQljYXNlIElGX1RZUEVfSURFIDoJcHJpbnRmKCJJREUiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9TQ1NJIDoJcHJpbnRmKCJTQ1NJIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfQVRBUEkgOglwcmludGYoIkFUQVBJIik7IGJyZWFrOworCQljYXNlIElGX1RZUEVfVVNCIDoJcHJpbnRmKCJVU0IiKTsgYnJlYWs7CisJCWNhc2UgSUZfVFlQRV9ET0MgOglwcmludGYoIkRPQyIpOyBicmVhazsKKwkJY2FzZSBJRl9UWVBFX01NQyA6CXByaW50ZigiTU1DIik7IGJyZWFrOworCQlkZWZhdWx0IDoJCXByaW50ZigiVW5rbm93biIpOworCX0KKwlwcmludGYoIlxuICBEZXZpY2UgJWQ6ICIsY3VyX2Rldi0+ZGV2KTsKKwlkZXZfcHJpbnQoY3VyX2Rldik7CisjZW5kaWYKKwlpZihyZWFkX2Jvb3RzZWN0YW5kdmkoJmJzLCAmdm9saW5mbywgJmZhdHNpemUpKSB7CisJCXByaW50ZigiXG5ObyB2YWxpZCBGQVQgZnMgZm91bmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWVtY3B5ICh2b2xfbGFiZWwsIHZvbGluZm8udm9sdW1lX2xhYmVsLCAxMSk7CisJdm9sX2xhYmVsWzExXSA9ICdcMCc7CisJdm9saW5mby5mc190eXBlWzVdPSdcMCc7CisJcHJpbnRmKCJQYXJ0aXRpb24gJWQ6IEZpbGVzeXN0ZW06ICVzIFwiJXNcIlxuIixjdXJfcGFydCx2b2xpbmZvLmZzX3R5cGUsdm9sX2xhYmVsKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQKK2ZpbGVfZmF0X2xzKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlyZXR1cm4gZG9fZmF0X3JlYWQoZGlyLCBOVUxMLCAwLCBMU19ZRVMpOworfQorCisKK2xvbmcKK2ZpbGVfZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKQoreworCWxvbmcgcmV0OworCXJldCA9IGRvX2ZhdF9yZWFkKGZpbGVuYW1lLCBidWZmZXIsIG1heHNpemUsIExTX05PKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2ZzL2ZhdC9maWxlLmMgYi94LWxvYWRlci9mcy9mYXQvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5OTQyNzEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9mcy9mYXQvZmlsZS5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogZmlsZS5jCisgKgorICogTWluaSAiVkZTIiBieSBNYXJjdXMgU3VuZGJlcmcKKyAqCisgKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CisgKiAyMDAzLTAzLTEwIC0ga2hhcnJpc0BuZXh1cy10ZWNoLm5ldCAtIHBvcnRlZCB0byB1Ym9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxwYXJ0Lmg+CisjaW5jbHVkZSA8ZmF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkKKworLyogU3VwcG9ydGVkIGZpbGVzeXN0ZW1zICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVzeXN0ZW0gZmlsZXN5c3RlbXNbXSA9IHsKKwl7IGZpbGVfZmF0X2RldGVjdGZzLCAgZmlsZV9mYXRfbHMsICBmaWxlX2ZhdF9yZWFkLCAgIkZBVCIgfSwKK307CisjZGVmaW5lIE5VTV9GSUxFU1lTCShzaXplb2YoZmlsZXN5c3RlbXMpL3NpemVvZihzdHJ1Y3QgZmlsZXN5c3RlbSkpCisKKy8qIFRoZSBmaWxlc3lzdGVtIHdoaWNoIHdhcyBsYXN0IGRldGVjdGVkICovCitzdGF0aWMgaW50IGN1cnJlbnRfZmlsZXN5c3RlbSA9IEZTVFlQRV9OT05FOworCisvKiBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLworI2RlZmluZSBDV0RfTEVOCQk1MTEKK2NoYXIgZmlsZV9jd2RbQ1dEX0xFTisxXSA9ICIvIjsKKworY29uc3QgY2hhciAqCitmaWxlX2dldGZzbmFtZShpbnQgaWR4KQoreworCWlmIChpZHggPCAwIHx8IGlkeCA+PSBOVU1fRklMRVNZUykgcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZmlsZXN5c3RlbXNbaWR4XS5uYW1lOworfQorCisKK3N0YXRpYyB2b2lkCitwYXRoY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpvcmlnZGVzdCA9IGRlc3Q7CisKKwlkbyB7CisJCWlmIChkZXN0LWZpbGVfY3dkID49IENXRF9MRU4pIHsKKwkJCSpkZXN0ID0gJ1wwJzsKKwkJCXJldHVybjsKKwkJfQorCQkqKGRlc3QpID0gKihzcmMpOworCQlpZiAoKnNyYyA9PSAnXDAnKSB7CisJCQlpZiAoZGVzdC0tICE9IG9yaWdkZXN0ICYmIElTRElSREVMSU0oKmRlc3QpKSB7CisJCQkJKmRlc3QgPSAnXDAnOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCSsrZGVzdDsKKwkJaWYgKElTRElSREVMSU0oKnNyYykpIHsKKwkJCXdoaWxlIChJU0RJUkRFTElNKCpzcmMpKSBzcmMrKzsKKwkJfSBlbHNlIHsKKwkJCXNyYysrOworCQl9CisJfSB3aGlsZSAoMSk7Cit9CisKKworaW50CitmaWxlX2NkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKElTRElSREVMSU0oKnBhdGgpKSB7CisJCXdoaWxlIChJU0RJUkRFTElNKCpwYXRoKSkgcGF0aCsrOworCQlzdHJuY3B5KGZpbGVfY3dkKzEsIHBhdGgsIENXRF9MRU4tMSk7CisJfSBlbHNlIHsKKwkJY29uc3QgY2hhciAqb3JpZ3BhdGggPSBwYXRoOworCQljaGFyICp0bXBzdHIgPSBmaWxlX2N3ZDsKKwkJaW50IGJhY2sgPSAwOworCisJCXdoaWxlICgqdG1wc3RyICE9ICdcMCcpIHRtcHN0cisrOworCQlkbyB7CisJCQl0bXBzdHItLTsKKwkJfSB3aGlsZSAoSVNESVJERUxJTSgqdG1wc3RyKSk7CisKKwkJd2hpbGUgKCpwYXRoID09ICcuJykgeworCQkJcGF0aCsrOworCQkJd2hpbGUgKCpwYXRoID09ICcuJykgeworCQkJCXBhdGgrKzsKKwkJCQliYWNrKys7CisJCQl9CisJCQlpZiAoKnBhdGggIT0gJ1wwJyAmJiAhSVNESVJERUxJTSgqcGF0aCkpIHsKKwkJCQlwYXRoID0gb3JpZ3BhdGg7CisJCQkJYmFjayA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQl3aGlsZSAoSVNESVJERUxJTSgqcGF0aCkpIHBhdGgrKzsKKwkJCW9yaWdwYXRoID0gcGF0aDsKKwkJfQorCisJCXdoaWxlIChiYWNrLS0pIHsKKwkJCS8qIFN0cmlwIG9mZiBwYXRoIGNvbXBvbmVudCAqLworCQkJd2hpbGUgKCFJU0RJUkRFTElNKCp0bXBzdHIpKSB7CisJCQkJdG1wc3RyLS07CisJCQl9CisJCQlpZiAodG1wc3RyID09IGZpbGVfY3dkKSB7CisJCQkJLyogSW5jcmVtZW50ZWQgYWdhaW4gcmlnaHQgYWZ0ZXIgdGhlIGxvb3AuICovCisJCQkJdG1wc3RyLS07CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBTa2lwIGRlbGltaXRlcnMgKi8KKwkJCXdoaWxlIChJU0RJUkRFTElNKCp0bXBzdHIpKSB0bXBzdHItLTsKKwkJfQorCQl0bXBzdHIrKzsKKwkJaWYgKCpwYXRoID09ICdcMCcpIHsKKwkJCWlmICh0bXBzdHIgPT0gZmlsZV9jd2QpIHsKKwkJCQkqdG1wc3RyID0gJy8nOworCQkJCXRtcHN0cisrOworCQkJfQorCQkJKnRtcHN0ciA9ICdcMCc7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkqdG1wc3RyID0gJy8nOworCQlwYXRoY3B5KHRtcHN0cisxLCBwYXRoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQKK2ZpbGVfZGV0ZWN0ZnModm9pZCkKK3sKKwlpbnQgaTsKKworCWN1cnJlbnRfZmlsZXN5c3RlbSA9IEZTVFlQRV9OT05FOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GSUxFU1lTOyBpKyspIHsKKwkJaWYgKGZpbGVzeXN0ZW1zW2ldLmRldGVjdCgpID09IDApIHsKKwkJCXN0cmNweShmaWxlX2N3ZCwgIi8iKTsKKwkJCWN1cnJlbnRfZmlsZXN5c3RlbSA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBjdXJyZW50X2ZpbGVzeXN0ZW07Cit9CisKKworaW50CitmaWxlX2xzKGNvbnN0IGNoYXIgKmRpcikKK3sKKwljaGFyIGZ1bGxwYXRoWzEwMjRdOworCWNvbnN0IGNoYXIgKmFyZzsKKworCWlmIChjdXJyZW50X2ZpbGVzeXN0ZW0gPT0gRlNUWVBFX05PTkUpIHsKKwkJcHJpbnRmKCJDYW4ndCBsaXN0IGZpbGVzIHdpdGhvdXQgYSBmaWxlc3lzdGVtIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoSVNESVJERUxJTSgqZGlyKSkgeworCQlhcmcgPSBkaXI7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihmdWxscGF0aCwgIiVzLyVzIiwgZmlsZV9jd2QsIGRpcik7CisJCWFyZyA9IGZ1bGxwYXRoOworCX0KKwlyZXR1cm4gZmlsZXN5c3RlbXNbY3VycmVudF9maWxlc3lzdGVtXS5scyhhcmcpOworfQorCisKK2xvbmcKK2ZpbGVfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpCit7CisJY2hhciBmdWxscGF0aFsxMDI0XTsKKwljb25zdCBjaGFyICphcmc7CisKKwlpZiAoY3VycmVudF9maWxlc3lzdGVtID09IEZTVFlQRV9OT05FKSB7CisJCXByaW50ZigiQ2FuJ3QgbG9hZCBmaWxlIHdpdGhvdXQgYSBmaWxlc3lzdGVtIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoSVNESVJERUxJTSgqZmlsZW5hbWUpKSB7CisJCWFyZyA9IGZpbGVuYW1lOworCX0gZWxzZSB7CisJCXNwcmludGYoZnVsbHBhdGgsICIlcy8lcyIsIGZpbGVfY3dkLCBmaWxlbmFtZSk7CisJCWFyZyA9IGZ1bGxwYXRoOworCX0KKworCXJldHVybiBmaWxlc3lzdGVtc1tjdXJyZW50X2ZpbGVzeXN0ZW1dLnJlYWQoYXJnLCBidWZmZXIsIG1heHNpemUpOworfQorCisjZW5kaWYgLyogI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZBVCkgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9iaXRzLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzI3M2UKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvYml0cy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGJpdHMuaAorICogQ29weXJpZ2h0IChjKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgZm91bmQgaW4gdGhlIGZpbGUKKyAqIG5hbWVkIENPUFlJTkcgdGhhdCBzaG91bGQgaGF2ZSBhY2NvbXBhbmllZCB0aGlzIGZpbGUuCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBfX2JpdHNfaAorI2RlZmluZSBfX2JpdHNfaCAxCisKKyNkZWZpbmUgQklUMCAgKDE8PDApCisjZGVmaW5lIEJJVDEgICgxPDwxKQorI2RlZmluZSBCSVQyICAoMTw8MikKKyNkZWZpbmUgQklUMyAgKDE8PDMpCisjZGVmaW5lIEJJVDQgICgxPDw0KQorI2RlZmluZSBCSVQ1ICAoMTw8NSkKKyNkZWZpbmUgQklUNiAgKDE8PDYpCisjZGVmaW5lIEJJVDcgICgxPDw3KQorI2RlZmluZSBCSVQ4ICAoMTw8OCkKKyNkZWZpbmUgQklUOSAgKDE8PDkpCisjZGVmaW5lIEJJVDEwICgxPDwxMCkKKyNkZWZpbmUgQklUMTEgKDE8PDExKQorI2RlZmluZSBCSVQxMiAoMTw8MTIpCisjZGVmaW5lIEJJVDEzICgxPDwxMykKKyNkZWZpbmUgQklUMTQgKDE8PDE0KQorI2RlZmluZSBCSVQxNSAoMTw8MTUpCisjZGVmaW5lIEJJVDE2ICgxPDwxNikKKyNkZWZpbmUgQklUMTcgKDE8PDE3KQorI2RlZmluZSBCSVQxOCAoMTw8MTgpCisjZGVmaW5lIEJJVDE5ICgxPDwxOSkKKyNkZWZpbmUgQklUMjAgKDE8PDIwKQorI2RlZmluZSBCSVQyMSAoMTw8MjEpCisjZGVmaW5lIEJJVDIyICgxPDwyMikKKyNkZWZpbmUgQklUMjMgKDE8PDIzKQorI2RlZmluZSBCSVQyNCAoMTw8MjQpCisjZGVmaW5lIEJJVDI1ICgxPDwyNSkKKyNkZWZpbmUgQklUMjYgKDE8PDI2KQorI2RlZmluZSBCSVQyNyAoMTw8MjcpCisjZGVmaW5lIEJJVDI4ICgxPDwyOCkKKyNkZWZpbmUgQklUMjkgKDE8PDI5KQorI2RlZmluZSBCSVQzMCAoMTw8MzApCisjZGVmaW5lIEJJVDMxICgxPDwzMSkKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9jbG9ja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTAwZDJlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2Nrcy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMjRYWF9DTE9DS1NfSF8KKyNkZWZpbmUgX09NQVAyNFhYX0NMT0NLU19IXworCisjZGVmaW5lIENPTU1JVF9ESVZJREVSUyAgMHgxCisjZGVmaW5lIE1PREVfQllQQVNTX0ZBU1QgMHgyCisjZGVmaW5lIEFQTExfTE9DSyAgICAgICAgMHhjCisjZGVmaW5lIERQTExfTE9DSyAgICAgICAgMHgzICAgLyogRFBMTCBsb2NrICovCisjZGVmaW5lIExERUxBWSAgICAgICAgICAgMTIwMDAwMDAKKworI2lmIGRlZmluZWQoQ09ORklHX09NQVAyNDJYKQorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrczI0MnguaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX09NQVAyNDNYKQorI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrczI0M3guaD4KKyNlbmRpZgorCisjZGVmaW5lIFMxMk0JCTEyMDAwMDAwCisjZGVmaW5lIFMxM00JCTEzMDAwMDAwCisjZGVmaW5lIFMxOV8yTQkJMTkyMDAwMDAKKyNkZWZpbmUgUzI0TQkJMjQwMDAwMDAKKyNkZWZpbmUgUzI2TQkJMjYwMDAwMDAKKyNkZWZpbmUgUzM4XzRNCQkzODQwMDAwMAorCisjZW5kaWYKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQyeC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0MnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWUxYzRlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0MnguaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNAorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAyNDJYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDI0MlhfQ0xPQ0tTX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqOworOyBQUkNNIFNjaGVtZSBJCis7Cis7IEVuYWJsZSBjbG9ja3MgYW5kIERQTEwgZm9yOgorOyAgRFBMTD0zMzAsIAlEUExMb3V0PTY2MCAgIAlNPTEsTj01NSAgIENNX0NMS1NFTDFfUExMWzIxOjhdICAxMi8yKjU1Cis7ICBDb3JlPTY2MCAgCShjb3JlIGRvbWFpbikgICBEUExMeDIgICAgIENNX0NMS1NFTDJfUExMWzE6MF0KKzsgIE1QVUY9MzMwICAgCShtcHUgZG9tYWluKSAgICAyICAgICAgICAgIENNX0NMS1NFTF9NUFVbNDowXQorOyAgRFNQRj0yMjAgICAgIChkc3AgZG9tYWluKSAgICAzICAgICAgICAgIENNX0NMS1NFTF9EU1BbNDowXQorOyAgRFNQST0xMTAgICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgIENNX0NMS1NFTF9EU1BbNjo1XQorOyAgRFNQX1MgICAgICAgIGFjdGl2YXRlZAkgICAgICAgICAgICAgICBDTV9DTEtTRUxfRFNQWzddCis7ICBJVkFGPTE2NSAgICAgKGRzcCBkb21haW4pICAgIDQgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxMjo4XQorOyAgSVZBRj04Mi41ICAgICAgIGF1dG8KKzsgIElWQUkgICAgICAgICAgICBhdXRvCis7ICBJVkFfTVBVICAgICAgICAgYXV0bworOyAgSVZBX1MgICAgICAgICAgYnlwYXNzICAgICAgICAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTNdCis7ICBHRlhGPTgyLjUgICAgKGdmeCBkb21haW4pCTggICAgICAgICAgQ01fQ0xLU0VMX0ZHWFsyOjBdCis7ICBTU0lfU1NSRj0yMjAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgQ01fQ0xLU0VMMV9DT1JFWzI0OjIwXQorOyAgU1NJX1NTVEY9MTEwICAgIGF1dG8KKzsgIEwzPTE2NU1oeiAgICAoc2RyYW0pICAgICAgICAgNCAgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNDowXQorOyAgTDQ9ODIuNU1oeiAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIAorOyAgQ19MNF9VU0I9NDEuMjUgICAgICAgICAgICAgICAxNiAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs2OjVdCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElfRFBMTF9PVVRfWDIgICAweDIgICAgLyogeDIgY29yZSBvdXQgKi8KKyNkZWZpbmUgSV9NUFVfRElWICAgICAgIDB4MiAgICAvKiBtcHUgPSBjb3JlLzIgKi8KKyNkZWZpbmUgSV9EU1BfRElWICAgICAgIDB4M2MzICAvKiBkc3AgJiBpdmEgZGl2aWRlciAqLworI2RlZmluZSBJX0dGWF9ESVYgICAgICAgMHgyCisjZGVmaW5lIElfQlVTX0RJViAgICAgICAweDA0NjAxMDQ0CisjaWZkZWYgSU5QVVRfQ0xLXzEzTUhaCisjZGVmaW5lIElfRFBMTF8zMzAgICAgICAweDAxMTRBQzAwICAvKiAxM01IeiAqLworI2Vsc2UKKyNkZWZpbmUgSV9EUExMXzMzMCAgICAgIDB4MDE4MzcxMDAgIC8qIDEyTUh6ICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio7Cis7IFBSQ00gU2NoZW1lIElJICAgPHRlc3RlZD4KKzsKKzsgRW5hYmxlIGNsb2NrcyBhbmQgRFBMTCBmb3I6Cis7ICBEUExMPTMwMCwgCURQTExvdXQ9NjAwICAgCU09MSxOPTUwICAgQ01fQ0xLU0VMMV9QTExbMjE6OF0gIDEyLzIqNTAKKzsgIENvcmU9NjAwICAJKGNvcmUgZG9tYWluKSAgIERQTEx4MiAgICAgQ01fQ0xLU0VMMl9QTExbMTowXQorOyAgTVBVRj0zMDAgICAJKG1wdSBkb21haW4pICAgIDIgICAgICAgICAgQ01fQ0xLU0VMX01QVVs0OjBdCis7ICBEU1BGPTIwMCAgICAoZHNwIGRvbWFpbikgICAgMyAgICAgICAgICBDTV9DTEtTRUxfRFNQWzQ6MF0KKzsgIERTUEk9MTAwICAgICAgICAgICAgICAgICAgICA2ICAgICAgICAgIENNX0NMS1NFTF9EU1BbNjo1XQorOyAgRFNQX1MgICAgICAgICAgYnlwYXNzCSAgICAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbN10KKzsgIElWQUY9MjAwICAgIChkc3AgZG9tYWluKSAgICAzICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTI6OF0KKzsgIElWQUY9MTAwICAgICAgICBhdXRvCis7ICBJVkFJICAgICAgICAgICAgYXV0bworOyAgSVZBX01QVSAgICAgICAgIGF1dG8KKzsgIElWQV9TICAgICAgICAgIGJ5cGFzcyAgICAgICAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTNdCis7ICBHRlhGPTUwICAgICAgKGdmeCBkb21haW4pCTEyICAgICAgICAgQ01fQ0xLU0VMX0ZHWFsyOjBdCis7ICBTU0lfU1NSRj0yMDAgICAgICAgICAgICAgICAgIDMgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbMjQ6MjBdCis7ICBTU0lfU1NURj0xMDAgICAgIGF1dG8KKzsgIEwzPTEwME1oeiAoc2RyYW0pICAgICAgICAgICAgNiAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs0OjBdCis7ICBMND0xMDBNaHogICAgICAgICAgICAgICAgICAgIDYKKzsgIENfTDRfVVNCPTUwICAgICAgICAgICAgICAgICAxMiAgICAgICAgIENNX0NMS1NFTDFfQ09SRVs2OjVdCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIElJX0RQTExfT1VUX1gyICAgMHgyICAgIC8qIHgyIGNvcmUgb3V0ICovCisjZGVmaW5lIElJX01QVV9ESVYgICAgICAgMHgyICAgIC8qIG1wdSA9IGNvcmUvMiAqLworI2RlZmluZSBJSV9EU1BfRElWICAgICAgIDB4MzQzICAvKiBkc3AgJiBpdmEgZGl2aWRlciAqLworI2RlZmluZSBJSV9HRlhfRElWICAgICAgIDB4MgorI2RlZmluZSBJSV9CVVNfRElWICAgICAgIDB4MDQ2MDEwMjYKKyNpZmRlZiBJTlBVVF9DTEtfMTNNSFoKKyNkZWZpbmUgSUlfRFBMTF8zMDAgICAgICAweDAxMTJDQzAwICAvKiAxM01IeiAqLworI2Vsc2UKKyNkZWZpbmUgSUlfRFBMTF8zMDAgICAgICAweDAxODMyMTAwICAvKiAxMk1IeiAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqOworOyBQUkNNIFNjaGVtZSBJSUkgIDx0ZXN0ZWQ+Cis7Cis7IEVuYWJsZSBjbG9ja3MgYW5kIERQTEwgZm9yOgorOyAgRFBMTD0yNjYsIAlEUExMb3V0PTUzMiAgIAlNPTUrMSxOPTEzMyBDTV9DTEtTRUwxX1BMTFsyMTo4XSAgMTIvNioxMzM9MjY2Cis7ICBDb3JlPTUzMiAgCShjb3JlIGRvbWFpbikgICBEUExMeDIgICAgICBDTV9DTEtTRUwyX1BMTFsxOjBdCis7ICBNUFVGPTI2NiAgIAkobXB1IGRvbWFpbikgICAgLzIgICAgICAgICAgQ01fQ0xLU0VMX01QVVs0OjBdCis7ICBEU1BGPTE3Ny4zICAgICAoZHNwIGRvbWFpbikgIC8zICAgICAgICAgIENNX0NMS1NFTF9EU1BbNDowXQorOyAgRFNQST04OC42NyAgICAgICAgICAgICAgICAgICAvNiAgICAgICAgICBDTV9DTEtTRUxfRFNQWzY6NV0KKzsgIERTUF9TICAgICAgICAgQUNUSVZBVEVECSAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbN10KKzsgIElWQUY9ODguNjcgICAgKGRzcCBkb21haW4pICAgLzMgICAgICAgICAgQ01fQ0xLU0VMX0RTUFsxMjo4XQorOyAgSVZBRj04OC42NyAgICAgICAgYXV0bworOyAgSVZBSSAgICAgICAgICAgIGF1dG8KKzsgIElWQV9NUFUgICAgICAgICBhdXRvCis7ICBJVkFfUyAgICAgICAgIEFDVElWQVRFRCAgICAgICAgICAgICAgICAgIENNX0NMS1NFTF9EU1BbMTNdCis7ICBHRlhGPTY2LjUgICAgICAoZ2Z4IGRvbWFpbikJLzggICAgICAgICAgQ01fQ0xLU0VMX0ZHWFsyOjBdOgorOyAgU1NJX1NTUkY9MTc3LjMgICAgICAgICAgICAgICAvMyAgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbMjQ6MjBdCis7ICBTU0lfU1NURj04OC42NyAgICAgYXV0bworOyAgTDM9MTMzTWh6IChzZHJhbSkgICAgICAgICAgICAvNCAgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNDowXQorOyAgTDQ9NjYuNU1oeiAgICAgICAgICAgICAgICAgICAvOAorOyAgQ19MNF9VU0I9MzMuMjUgICAgICAgICAgICAgICAvMTYgICAgICAgICBDTV9DTEtTRUwxX0NPUkVbNjo1XQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJSUlfRFBMTF9PVVRfWDIgICAweDIgICAgLyogeDIgY29yZSBvdXQgKi8KKyNkZWZpbmUgSUlJX01QVV9ESVYgICAgICAgMHgyICAgIC8qIG1wdSA9IGNvcmUvMiAqLworI2RlZmluZSBJSUlfRFNQX0RJViAgICAgICAweDIzQzMgLyogZHNwICYgaXZhIGRpdmlkZXIgc3ljaCBlbmFibGVkKi8KKyNkZWZpbmUgSUlJX0dGWF9ESVYgICAgICAgMHgyCisjZGVmaW5lIElJSV9CVVNfRElWICAgICAgIDB4MDgzMDEwNDQKKyNpZmRlZiBJTlBVVF9DTEtfMTNNSFoKKyNkZWZpbmUgSUlJX0RQTExfMjY2ICAgICAgMHgwMTEwQUMwMCAgIC8qIDEzTUh6ICovCisjZWxzZQorI2RlZmluZSBJSUlfRFBMTF8yNjYgICAgICAweDAxODg1NTAwICAgLyogMTJNSHogKi8KKyNlbmRpZgorCisvKiBzZXQgZGVmYXVsdHMgZm9yIGJvb3QgdXAgKi8KKyNpZmRlZiBQUkNNX0NPTkZJR19JCisjIGRlZmluZSBEUExMX09VVCAgICAgICAgIElfRFBMTF9PVVRfWDIKKyMgZGVmaW5lIE1QVV9ESVYgICAgICAgICAgSV9NUFVfRElWCisjIGRlZmluZSBEU1BfRElWICAgICAgICAgIElfRFNQX0RJVgorIyBkZWZpbmUgR0ZYX0RJViAgICAgICAgICBJX0dGWF9ESVYKKyMgZGVmaW5lIEJVU19ESVYgICAgICAgICAgSV9CVVNfRElWCisjIGRlZmluZSBEUExMX1ZBTCAgICAgICAgIElfRFBMTF8yNjYKKyNlbGlmIFBSQ01fQ09ORklHX0lJCisjIGRlZmluZSBEUExMX09VVCAgICAgICAgIElJX0RQTExfT1VUX1gyCisjIGRlZmluZSBNUFVfRElWICAgICAgICAgIElJX01QVV9ESVYKKyMgZGVmaW5lIERTUF9ESVYgICAgICAgICAgSUlfRFNQX0RJVgorIyBkZWZpbmUgR0ZYX0RJViAgICAgICAgICBJSV9HRlhfRElWCisjIGRlZmluZSBCVVNfRElWICAgICAgICAgIElJX0JVU19ESVYKKyMgZGVmaW5lIERQTExfVkFMICAgICAgICAgSUlfRFBMTF8zMDAKKyNlbGlmIFBSQ01fQ09ORklHX0lJSQorIyBkZWZpbmUgRFBMTF9PVVQgICAgICAgICBJSUlfRFBMTF9PVVRfWDIKKyMgZGVmaW5lIE1QVV9ESVYgICAgICAgICAgSUlJX01QVV9ESVYKKyMgZGVmaW5lIERTUF9ESVYgICAgICAgICAgSUlJX0RTUF9ESVYKKyMgZGVmaW5lIEdGWF9ESVYgICAgICAgICAgSUlJX0dGWF9ESVYKKyMgZGVmaW5lIEJVU19ESVYgICAgICAgICAgSUlJX0JVU19ESVYKKyMgZGVmaW5lIERQTExfVkFMICAgICAgICAgSUlJX0RQTExfMjY2CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvY2xvY2tzMjQzeC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0M3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGQyZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L2Nsb2NrczI0M3guaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNQorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiAvUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAgKi8KKyNpZm5kZWYgX09NQVAyNDNYX0NMT0NLU19IXworI2RlZmluZSBfT01BUDI0M1hfQ0xPQ0tTX0hfCisKKy8qIGNtX2Nsa3NlbCBjb3JlIGZpZWxkcyBub3QgcmF0aW8gZ292ZXJuZWQgKi8KKyNkZWZpbmUgUlhfQ0xLU0VMX0RTUzEJCSgweDEwIDw8IDgpCisjZGVmaW5lIFJYX0NMS1NFTF9EU1MyCQkoMHgwIDw8IDEzKQorI2RlZmluZSBSWF9DTEtTRUxfU1NJCQkoMHg1IDw8IDIwKQorCisvKiAyNDMwIFJhdGlvJ3MgKi8KKy8qIDI0MzAtUmF0aW8gQ29uZmlnIDEgKi8KKyNkZWZpbmUgUjFfQ0xLU0VMX0wzCQkoNCA8PCAwKQorI2RlZmluZSBSMV9DTEtTRUxfTDQJCSgyIDw8IDUpCisjZGVmaW5lIFIxX0NMS1NFTF9VU0IJCSg0IDw8IDI1KQorI2RlZmluZSBSMV9DTV9DTEtTRUwxX0NPUkVfVkFMCVIxX0NMS1NFTF9VU0IgfCBSWF9DTEtTRUxfU1NJIHwgUlhfQ0xLU0VMX0RTUzIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJYX0NMS1NFTF9EU1MxIHwgUjFfQ0xLU0VMX0w0IHwgUjFfQ0xLU0VMX0wzCisjZGVmaW5lIFIxX0NMS1NFTF9NUFUJCSgyIDw8IDApCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9NUFVfVkFMCVIxX0NMS1NFTF9NUFUKKyNkZWZpbmUgUjFfQ0xLU0VMX0RTUAkJKDIgPDwgMCkKKyNkZWZpbmUgUjFfQ0xLU0VMX0RTUF9JRgkoMiA8PCA1KQorI2RlZmluZSBSMV9DTV9DTEtTRUxfRFNQX1ZBTAlSMV9DTEtTRUxfRFNQIHwgUjFfQ0xLU0VMX0RTUF9JRgorI2RlZmluZSBSMV9DTEtTRUxfR0ZYCQkoMiA8PCAwKQorI2RlZmluZSBSMV9DTV9DTEtTRUxfR0ZYX1ZBTAlSMV9DTEtTRUxfR0ZYCisjZGVmaW5lIFIxX0NMS1NFTF9NRE0JCSg0IDw8IDApCisjZGVmaW5lIFIxX0NNX0NMS1NFTF9NRE1fVkFMCVIxX0NMS1NFTF9NRE0KKworLyogMjQzMC1SYXRpbyBDb25maWcgMiAqLworI2RlZmluZSBSMl9DTEtTRUxfTDMJCSg2IDw8IDApCisjZGVmaW5lIFIyX0NMS1NFTF9MNAkJKDIgPDwgNSkKKyNkZWZpbmUgUjJfQ0xLU0VMX1VTQgkJKDIgPDwgMjUpCisjZGVmaW5lIFIyX0NNX0NMS1NFTDFfQ09SRV9WQUwJUjJfQ0xLU0VMX1VTQiB8IFJYX0NMS1NFTF9TU0kgfCBSWF9DTEtTRUxfRFNTMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlhfQ0xLU0VMX0RTUzEgfCBSMl9DTEtTRUxfTDQgfCBSMl9DTEtTRUxfTDMKKyNkZWZpbmUgUjJfQ0xLU0VMX01QVQkJKDIgPDwgMCkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX01QVV9WQUwJUjJfQ0xLU0VMX01QVQorI2RlZmluZSBSMl9DTEtTRUxfRFNQCQkoMiA8PCAwKQorI2RlZmluZSBSMl9DTEtTRUxfRFNQX0lGCSgzIDw8IDUpCisjZGVmaW5lIFIyX0NNX0NMS1NFTF9EU1BfVkFMCVIyX0NMS1NFTF9EU1AgfCBSMl9DTEtTRUxfRFNQX0lGCisjZGVmaW5lIFIyX0NMS1NFTF9HRlgJCSgyIDw8IDApCisjZGVmaW5lIFIyX0NNX0NMS1NFTF9HRlhfVkFMICAgIFIyX0NMS1NFTF9HRlgKKyNkZWZpbmUgUjJfQ0xLU0VMX01ETQkJKDYgPDwgMCkKKyNkZWZpbmUgUjJfQ01fQ0xLU0VMX01ETV9WQUwJUjJfQ0xLU0VMX01ETQorCisvKiAyNDMwLVJhdGlvIEJvb3QgKi8KKyNkZWZpbmUgUkJfQ0xLU0VMX0wzCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTEtTRUxfTDQJCSgxIDw8IDUpCisjZGVmaW5lIFJCX0NMS1NFTF9VU0IJCSgxIDw8IDI1KQorI2RlZmluZSBSQl9DTV9DTEtTRUwxX0NPUkVfVkFMCVJCX0NMS1NFTF9VU0IgfCBSWF9DTEtTRUxfU1NJIHwgUlhfQ0xLU0VMX0RTUzIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJYX0NMS1NFTF9EU1MxIHwgUkJfQ0xLU0VMX0w0IHwgUkJfQ0xLU0VMX0wzCisjZGVmaW5lIFJCX0NMS1NFTF9NUFUJCSgxIDw8IDApCisjZGVmaW5lIFJCX0NNX0NMS1NFTF9NUFVfVkFMCVJCX0NMS1NFTF9NUFUKKyNkZWZpbmUgUkJfQ0xLU0VMX0RTUAkJKDEgPDwgMCkKKyNkZWZpbmUgUkJfQ0xLU0VMX0RTUF9JRgkoMSA8PCA1KQorI2RlZmluZSBSQl9DTV9DTEtTRUxfRFNQX1ZBTAlSQl9DTEtTRUxfRFNQIHwgUkJfQ0xLU0VMX0RTUF9JRgorI2RlZmluZSBSQl9DTEtTRUxfR0ZYCQkoMSA8PCAwKQorI2RlZmluZSBSQl9DTV9DTEtTRUxfR0ZYX1ZBTAlSQl9DTEtTRUxfR0ZYCisjZGVmaW5lIFJCX0NMS1NFTF9NRE0JCSgxIDw8IDApCisjZGVmaW5lIFJCX0NNX0NMS1NFTF9NRE1fVkFMCVJCX0NMS1NFTF9NRE0KKworLyogMjQzMCBUYXJnZXQgbW9kZXM6IEFsb25nIHdpdGggZWFjaCBjb25maWd1cmF0aW9uIHRoZSBDUFUgaGFzIHNldmVyYWwgbW9kZXMKKyAqIHdoaWNoIGdvZXMgYWxvbmcgd2l0aCB0aGVtLiBNb2RlcyBtYWlubHkgYXJlIHRoZSBhZGRpdGlvbiBvZiBkZXNjcml0ZSBEUExMCisgKiBjb21iaW5hdGlvbnMgdG8gZ28gYWxvbmcgd2l0aCBhIHJhdGlvLgorICovCisvKiBoYXJkd2FyZSBnb3ZlcmVuZCAqLworI2RlZmluZSBNWF80OE1fU1JDCQkoMCA8PCAzKQorI2RlZmluZSBNWF81NE1fU1JDCQkoMCA8PCA1KQorI2RlZmluZSBNWF9BUExMU19DTElLSU5fMTIJKDMgPDwgMjMpCisjZGVmaW5lIE1YX0FQTExTX0NMSUtJTl8xMwkoMiA8PCAyMykKKyNkZWZpbmUgTVhfQVBMTFNfQ0xJS0lOXzE5XzIJKDAgPDwgMjMpCisKKy8qIDI0MzAgLSBzdGFuZGFsb25lLCAyKnJlZipNLyhuKzEpLCBNL04gaXMgZm9yIGV4YWN0bmVzcyBub3QgcmVsb2NrIHNwZWVkICovCisKKy8qIGJvb3QgKGJvb3QpICovCisjZGVmaW5lIE1CX0RQTExfTVVMVAkJCQkoMSA8PCAxMikKKyNkZWZpbmUgTUJfRFBMTF9ESVYJCQkJCSgwIDw8IDgpCisjZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzEyX1ZBTCAgICAgTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNQl9EUExMX0RJViBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1CX0RQTExfTVVMVCB8IE1YX0FQTExTX0NMSUtJTl8xMgorCisjZGVmaW5lIE1CX0NNX0NMS1NFTDFfUExMXzEzX1ZBTCAgICBNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE1CX0RQTExfRElWIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTUJfRFBMTF9NVUxUIHwgTVhfQVBMTFNfQ0xJS0lOXzEzCisKKyNkZWZpbmUgTUJfQ01fQ0xLU0VMMV9QTExfMTlfVkFMICAgIE1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTUJfRFBMTF9ESVYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNQl9EUExMX01VTFQgfCBNWF9BUExMU19DTElLSU5fMTkKKworLyogIzIgICAocmF0aW8xKSBEUExMID0gMzMwKjIgPSA2NjBNSHosIEwzPTE2NU1IeiAqLworCisjZGVmaW5lIE0yX0RQTExfTVVMVF8xMgkJICAgICAgICAoNTUgPDwgMTIpCisjZGVmaW5lIE0yX0RQTExfRElWXzEyCQkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIE0yX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0yX0RQTExfRElWXzEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTJfRFBMTF9NVUxUXzEyIHwgTVhfQVBMTFNfQ0xJS0lOXzEyCisvKiBVc2UgNjU4LjdNSHogaW5zdGVhZCBvZiA2NjBNSHogZm9yIExQLVJlZnJlc2ggTT03NiBOPTIsIHJlbG9jayB0aW1lIGlzc3VlICovCisjZGVmaW5lIE0yX0RQTExfTVVMVF8xMwkJICAgICAgICAoMzMwIDw8IDEyKQorI2RlZmluZSBNMl9EUExMX0RJVl8xMwkJICAgICAgICAoMTIgPDwgOCkKKyNkZWZpbmUgTTJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTJfRFBMTF9ESVZfMTMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNMl9EUExMX01VTFRfMTMgfCBNWF9BUExMU19DTElLSU5fMTMKKyNkZWZpbmUgTTJfRFBMTF9NVUxUXzE5CQkgICAgICAgICgyNzUgPDwgMTIpCisjZGVmaW5lIE0yX0RQTExfRElWXzE5CQkgICAgICAgICgxNSA8PCA4KQorI2RlZmluZSBNMl9DTV9DTEtTRUwxX1BMTF8xOV9WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNMl9EUExMX0RJVl8xOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0yX0RQTExfTVVMVF8xOSB8IE1YX0FQTExTX0NMSUtJTl8xOV8yCisKKy8qICMzICAgKHJhdGlvMikgRFBMTCA9IDMzMCoyID0gNjYwTUh6LCBMMz0xMTBNSHogKi8KKyNkZWZpbmUgTTNfRFBMTF9NVUxUXzEyCQkgICAgICAgICg1NSA8PCAxMikKKyNkZWZpbmUgTTNfRFBMTF9ESVZfMTIJCSAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgTTNfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTNfRFBMTF9ESVZfMTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNM19EUExMX01VTFRfMTIgfCBNWF9BUExMU19DTElLSU5fMTIKKyNkZWZpbmUgTTNfRFBMTF9NVUxUXzEzCQkgICAgICAgICgzMzAgPDwgMTIpCisjZGVmaW5lIE0zX0RQTExfRElWXzEzCQkgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBNM19DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNM19EUExMX0RJVl8xMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE0zX0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMworI2RlZmluZSBNM19EUExMX01VTFRfMTkJCSAgICAgICAgKDI3NSA8PCAxMikKKyNkZWZpbmUgTTNfRFBMTF9ESVZfMTkJCSAgICAgICAgKDE1IDw8IDgpCisjZGVmaW5lIE0zX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE0zX0RQTExfRElWXzE5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTNfRFBMTF9NVUxUXzE5IHwgTVhfQVBMTFNfQ0xJS0lOXzE5XzIKKworLyogIzQgICAocmF0aW8yKSwgRFBMTCA9IDM5OSoyID0gNzk4TUh6LCBMMz0xMzNNSHoqLworI2RlZmluZSBNNF9EUExMX01VTFRfMTIJCSAgICAgICAgKDEzMyA8PCAxMikKKyNkZWZpbmUgTTRfRFBMTF9ESVZfMTIJCSAgICAgICAgKDMgPDwgOCkKKyNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTJfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTRfRFBMTF9ESVZfMTIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNF9EUExMX01VTFRfMTIgfCBNWF9BUExMU19DTElLSU5fMTIKKyNkZWZpbmUgTTRfRFBMTF9NVUxUXzEzCQkgICAgICAgICgzOTkgPDwgMTIpCisjZGVmaW5lIE00X0RQTExfRElWXzEzCQkgICAgICAgICgxMiA8PCA4KQorI2RlZmluZSBNNF9DTV9DTEtTRUwxX1BMTF8xM19WQUwJTVhfNDhNX1NSQyB8IE1YXzU0TV9TUkMgfCBNNF9EUExMX0RJVl8xMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE00X0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMworI2RlZmluZSBNNF9EUExMX01VTFRfMTkJCSAgICAgICAgKDE0NSA8PCAxMikKKyNkZWZpbmUgTTRfRFBMTF9ESVZfMTkJCSAgICAgICAgKDYgPDwgOCkKKyNkZWZpbmUgTTRfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTRfRFBMTF9ESVZfMTkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNNF9EUExMX01VTFRfMTkgfCBNWF9BUExMU19DTElLSU5fMTlfMgorCisvKiAjNWEgIChyYXRpbzEpIGJhc2Vwb3J0LXRhcmdldCwgdGFyZ2V0IERQTEwgPSAyNjYqMiA9IDUzMk1IeiwgTDM9MTMzTUh6ICovCisjZGVmaW5lIE01QV9EUExMX01VTFRfMTIJICAgICAgICAoMTMzIDw8IDEyKQorI2RlZmluZSBNNUFfRFBMTF9ESVZfMTIJCSAgICAgICAgKDUgPDwgOCkKKyNkZWZpbmUgTTVBX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01QV9EUExMX0RJVl8xMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01QV9EUExMX01VTFRfMTIgfCBNWF9BUExMU19DTElLSU5fMTIKKyNkZWZpbmUgTTVBX0RQTExfTVVMVF8xMwkgICAgICAgICgyNjYgPDwgMTIpCisjZGVmaW5lIE01QV9EUExMX0RJVl8xMwkJICAgICAgICAoMTIgPDwgOCkKKyNkZWZpbmUgTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01QV9EUExMX0RJVl8xMyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01QV9EUExMX01VTFRfMTMgfCBNWF9BUExMU19DTElLSU5fMTMKKyNkZWZpbmUgTTVBX0RQTExfTVVMVF8xOQkgICAgICAgICgxODAgPDwgMTIpCisjZGVmaW5lIE01QV9EUExMX0RJVl8xOQkJICAgICAgICAoMTIgPDwgOCkKKyNkZWZpbmUgTTVBX0NNX0NMS1NFTDFfUExMXzE5X1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01QV9EUExMX0RJVl8xOSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01QV9EUExMX01VTFRfMTkgfCBNWF9BUExMU19DTElLSU5fMTlfMgorCisvKiAjNWIgIChyYXRpbzEpIHRhcmdldCBEUExMID0gMjAwKjIgPSA0MDBNSHosIEwzPTEwME1IeiAqLworI2RlZmluZSBNNUJfRFBMTF9NVUxUXzEyCSAgICAgICAgKDUwIDw8IDEyKQorI2RlZmluZSBNNUJfRFBMTF9ESVZfMTIJCSAgICAgICAgKDIgPDwgOCkKKyNkZWZpbmUgTTVCX0NNX0NMS1NFTDFfUExMXzEyX1ZBTAlNWF80OE1fU1JDIHwgTVhfNTRNX1NSQyB8IE01Ql9EUExMX0RJVl8xMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE01Ql9EUExMX01VTFRfMTIgfCBNWF9BUExMU19DTElLSU5fMTIKKyNkZWZpbmUgTTVCX0RQTExfTVVMVF8xMwkgICAgICAgICgyMDAgPDwgMTIpCisjZGVmaW5lIE01Ql9EUExMX0RJVl8xMwkJICAgICAgICAoMTIgPDwgOCkKKworI2RlZmluZSBNNUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVCX0RQTExfRElWXzEzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVCX0RQTExfTVVMVF8xMyB8IE1YX0FQTExTX0NMSUtJTl8xMworI2RlZmluZSBNNUJfRFBMTF9NVUxUXzE5CSAgICAgICAgKDEyNSA8PCAxMikKKyNkZWZpbmUgTTVCX0RQTExfRElWXzE5CQkgICAgICAgICgzMSA8PCA4KQorI2RlZmluZSBNNUJfQ01fQ0xLU0VMMV9QTExfMTlfVkFMCU1YXzQ4TV9TUkMgfCBNWF81NE1fU1JDIHwgTTVCX0RQTExfRElWXzE5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTTVCX0RQTExfTVVMVF8xOSB8IE1YX0FQTExTX0NMSUtJTl8xOV8yCisKKy8qIDI0MzAgLSBjaGFzc2lzIChzZWRuYSkgKi8KKwkvKiAxNjUgKHJhdGlvMSkgc2FtZSBhcyBhYm92ZSAjMiAqLworCS8qIDE1MCAocmF0aW8xKSovCisJLyogMTMzIChyYXRpbzIpIHNhbWUgYXMgYWJvdmUgIzQgKi8KKwkvKiAxMTAgKHJhdGlvMikgc2FtZSBhcyBhYm92ZSAjMyovCisJLyogMTA0IChyYXRpbzIpKi8KKwkvKiBib290IChib290KSAqLworCisvKiBoaWdoIGFuZCBsb3cgb3BlcmF0aW9uIHZhbHVlICovCisjZGVmaW5lIE1YX0NMS1NFTDJfUExMXzJ4X1ZBTCAgICgyIDw8IDApCisjZGVmaW5lIE1YX0NMS1NFTDJfUExMXzF4X1ZBTCAgICgxIDw8IDApCisKKy8qIHNldCBkZWZhdWx0cyBmb3IgYm9vdCB1cCAqLworI2lmIGRlZmluZWQoUFJDTV9DT05GSUdfMikgICAgIC8qIEFSTS0zMzBNSHogSVZBMi0zMzBNSHogTDMtMTY1TUh6ICovCisjIGRlZmluZSBEUExMX09VVAlNWF9DTEtTRUwyX1BMTF8yeF9WQUwKKyMgZGVmaW5lIE1QVV9ESVYJUjFfQ0xLU0VMX01QVQorIyBkZWZpbmUgRFNQX0RJVglSMV9DTV9DTEtTRUxfRFNQX1ZBTAorIyBkZWZpbmUgR0ZYX0RJVglSMV9DTV9DTEtTRUxfR0ZYX1ZBTAorIyBkZWZpbmUgQlVTX0RJVglSMV9DTV9DTEtTRUwxX0NPUkVfVkFMCisjIGRlZmluZSBEUExMX1ZBTAlNMl9DTV9DTEtTRUwxX1BMTF8xM19WQUwKKyMgZGVmaW5lIE1ETV9ESVYJUjJfQ01fQ0xLU0VMX01ETV9WQUwKKyNlbGlmIGRlZmluZWQoUFJDTV9DT05GSUdfMykgICAgIC8qIEFSTS0zMzBNSHogSVZBMi0zMzBNSHogTDMtMTEwTUh6ICovCisjIGRlZmluZSBEUExMX09VVAlNWF9DTEtTRUwyX1BMTF8yeF9WQUwKKyMgZGVmaW5lIE1QVV9ESVYJUjJfQ0xLU0VMX01QVQorIyBkZWZpbmUgRFNQX0RJVglSMl9DTV9DTEtTRUxfRFNQX1ZBTAorIyBkZWZpbmUgR0ZYX0RJVglSMl9DTV9DTEtTRUxfR0ZYX1ZBTAorIyBkZWZpbmUgQlVTX0RJVglSMl9DTV9DTEtTRUwxX0NPUkVfVkFMCisjIGRlZmluZSBEUExMX1ZBTAlNM19DTV9DTEtTRUwxX1BMTF8xM19WQUwKKyMgZGVmaW5lIE1ETV9ESVYJUjJfQ01fQ0xLU0VMX01ETV9WQUwKKyNlbGlmIGRlZmluZWQoUFJDTV9DT05GSUdfNUEpICAvKiBBUk0tMjY2TUh6IElWQTItMjY2TUh6IEwzLTEzM01IeiAqLworIyBkZWZpbmUgRFBMTF9PVVQJTVhfQ0xLU0VMMl9QTExfMnhfVkFMCisjIGRlZmluZSBNUFVfRElWCVIxX0NMS1NFTF9NUFUKKyMgZGVmaW5lIERTUF9ESVYJUjFfQ01fQ0xLU0VMX0RTUF9WQUwKKyMgZGVmaW5lIEdGWF9ESVYJUjFfQ01fQ0xLU0VMX0dGWF9WQUwKKyMgZGVmaW5lIEJVU19ESVYJUjFfQ01fQ0xLU0VMMV9DT1JFX1ZBTAorIyBkZWZpbmUgRFBMTF9WQUwJTTVBX0NNX0NMS1NFTDFfUExMXzEzX1ZBTAorIyBkZWZpbmUgTURNX0RJVglSMl9DTV9DTEtTRUxfTURNX1ZBTAorI2VsaWYgZGVmaW5lZChQUkNNX0NPTkZJR181QikgIC8qIEFSTS0yMDBNSHogSVZBMi0yMDBNSHogTDMtMTAwTUh6ICovCisjIGRlZmluZSBEUExMX09VVAlNWF9DTEtTRUwyX1BMTF8yeF9WQUwKKyMgZGVmaW5lIE1QVV9ESVYJUjFfQ0xLU0VMX01QVQorIyBkZWZpbmUgRFNQX0RJVglSMV9DTV9DTEtTRUxfRFNQX1ZBTAorIyBkZWZpbmUgR0ZYX0RJVglSMV9DTV9DTEtTRUxfR0ZYX1ZBTAorIyBkZWZpbmUgQlVTX0RJVglSMV9DTV9DTEtTRUwxX0NPUkVfVkFMCisjIGRlZmluZSBEUExMX1ZBTAlNNUJfQ01fQ0xLU0VMMV9QTExfMTNfVkFMCisjIGRlZmluZSBNRE1fRElWCVIxX0NNX0NMS1NFTF9NRE1fVkFMCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvbWVtLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEzZGE3MwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9tZW0uaApAQCAtMCwwICsxLDM4MyBAQAorCisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMjRYWF9NRU1fSF8KKyNkZWZpbmUgX09NQVAyNFhYX01FTV9IXworCisjZGVmaW5lIFNEUkNfQ1MwX09TRVQgICAgMHgwCisjZGVmaW5lIFNEUkNfQ1MxX09TRVQgICAgMHgzMCAgLyogbWlycm9yIENTMSByZWdzIGFwcGVhciBvZmZzZXQgMHgzMCBmcm9tIENTMCAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworLyogc3RydWN0J3MgZm9yIGhvbGRpbmcgZGF0YSB0YWJsZXMgZm9yIGN1cnJlbnQgYm9hcmRzLCB0aGV5IGFyZSBnZXR0aW5nIHVzZWQKKyAgIGVhcmx5IGluIGluaXQgd2hlbiBOTyBnbG9iYWwgYWNjZXNzIGFyZSB0aGVyZSAqLworc3RydWN0IHNkcmNfZGF0YV9zIHsKKwl1MzIgICAgc2RyY19zaGFyaW5nOworCXUzMiAgICBzZHJjX21kY2ZnXzBfZGRyOworCXUzMiAgICBzZHJjX21kY2ZnXzBfc2RyOworCXUzMiAgICBzZHJjX2FjdGltX2N0cmxhXzA7CisJdTMyICAgIHNkcmNfYWN0aW1fY3RybGJfMDsKKwl1MzIgICAgc2RyY19yZnJfY3RybDsKKwl1MzIgICAgc2RyY19tcl8wX2RkcjsKKwl1MzIgICAgc2RyY19tcl8wX3NkcjsKKwl1MzIgICAgc2RyY19kbGxhYl9jdHJsOworfSAvKl9fYXR0cmlidXRlX18gKChwYWNrZWQpKSovOwordHlwZWRlZiBzdHJ1Y3Qgc2RyY19kYXRhX3Mgc2RyY19kYXRhX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJU1RBQ0tFRAkJPSAwLAorCUlQX0REUgkJPSAxLAorCUNPTUJPX0REUgk9IDIsCisJSVBfU0RSCSAJPSAzLAorfSBtZW1fdDsKKworI2VuZGlmCisKKy8qIHNldCB0aGUgMjQzeC1TRFJDIGluY29taW5nIGFkZHJlc3MgY29udmVudGlvbiAqLworI2lmIGRlZmluZWQoU0RSQ19CX1JfQykKKyNkZWZpbmUgQl9BTEwJKDAgPDwgNikJLyogYmFuay1yb3ctY29sdW1uICovCisjZWxpZiBkZWZpbmVkKFNEUkNfQjFfUl9CMF9DKQorI2RlZmluZSBCX0FMTAkoMSA8PCA2KQkvKiBiYW5rMS1yb3ctYmFuazAtY29sdW1uICovCisjZWxpZiBkZWZpbmVkKFNEUkNfUl9CX0MpCisjZGVmaW5lIEJfQUxMCSgyIDw8IDYpCS8qIHJvdy1iYW5rLWNvbHVtbiAqLworI2VuZGlmCisKKy8qIFNsb3dlciBmdWxsIGZyZXF1ZW5jeSByYW5nZSBkZWZhdWx0IHRpbWluZ3MgZm9yIHgzMiBvcGVyYXRpb24qLworI2RlZmluZSBINF8yNDIwX1NEUkNfU0hBUklORwkJMHgwMDAwMDEwMAorI2RlZmluZSBINF8yNDIwX1NEUkNfTURDRkdfMF9TRFIJMHgwMEQwNDAxMCAvKiBkaXNjcmV0ZSBzZHIgbW9kdWxlICovCisjZGVmaW5lIEg0XzI0MjBfU0RSQ19NUl8wX1NEUgkJMHgwMDAwMDAzMQorI2RlZmluZSBINF8yNDIwX1NEUkNfTURDRkdfMF9ERFIJMHgwMTcwMjAxMSAvKiBkZXNjcml0ZSBkZHIgbW9kdWxlICovCisjZGVmaW5lIFNEUF8yNDMwX1NEUkNfTURDRkdfMF9ERFIJKDB4MDI1ODQwMTl8Ql9BTEwpIC8qIEluZmluIGRkciBtb2R1bGUgKi8KKyNkZWZpbmUgSDRfMjQyMF9DT01CT19NRENGR18wX0REUgkweDAwODAxMDExIC8qIGNvbWJvIG1vZHVsZSAqLworI2RlZmluZSBINF8yNDIwX1NEUkNfTVJfMF9ERFIJCTB4MDAwMDAwMzIKKworI2RlZmluZSBINF8yNDIyX1NEUkNfU0hBUklORwkJMHgwMDAwNGIwMAorI2RlZmluZSBINF8yNDIyX1NEUkNfTURDRkdfTU9OT19ERFIJMHgwMUEwMjAxMSAvKiBzdGFja2VkIG1vbm8gZGllIGRkciBvbiAyNDIyICovCisjZGVmaW5lIEg0XzI0MjJfU0RSQ19NRENGR18wX0REUgkweDAwODAxMDExIC8qIHN0YWNrZWQgZHVhbCBkaWUgZGRyIG9uIDI0MjIgKi8KKyNkZWZpbmUgSDRfMjQyMl9TRFJDX01SXzBfRERSCQkweDAwMDAwMDMyCisKKyNkZWZpbmUgSDRfMjQyM19TRFJDX1NIQVJJTkcJCTB4MDAwMDQ5MDAgLyogMjQyMFBPUCBib2FyZCBja2UxIG5vdCBjb25uZWN0ZWQgKi8KKyNkZWZpbmUgSDRfMjQyM19TRFJDX01EQ0ZHXzBfRERSCTB4MDFBMDIwMTEgLyogc3RhY2tlZCBkdWFsIGRpZSBkZHIgb24gMjQyMyAqLworI2RlZmluZSBINF8yNDIzX1NEUkNfTURDRkdfMV9ERFIJMHgwMDgwMTAxMSAvKiBzdGFja2VkIGR1YWwgZGllIGRkciBvbiAyNDIzICovCisKKy8qIEVTMSB3b3JrIGFyb3VuZCB0aW1pbmdzICovCisjZGVmaW5lIEg0XzI0MnhfU0RSQ19BQ1RJTV9DVFJMQV8wX0VTMQkweDliZWFkOTA5ICAvKiAxNjVNaHogZm9yIHVzZSB3aXRoIDEwMC8xMzMgKi8KKyNkZWZpbmUgSDRfMjQyeF9TRFJDX0FDVElNX0NUUkxCXzBfRVMxICAweDAwMDAwMDIwCisjZGVmaW5lIEg0XzI0MnhfU0RSQ19SRlJfQ1RSTF9FUzEJMHgwMDAwMjQwMSAgLyogdXNlIG92ZXIgcmVmcmVzaCBmb3IgRVMxICovCisKKy8qIG9wdGltaXplZCB0aW1pbmdzIGdvb2QgZm9yIGN1cnJlbnQgc2hpcHBpbmcgcGFydHMgKi8KKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6ICAgMHg1QTU5QjQ4NQorI2RlZmluZSBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMDBNSHogICAweDAwMDAwMDBlCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEzM01IeiAgIDB4OEJBNkU2QzggLyogdGVtcCB3YXJuIDAgc2V0dGluZ3MgKi8KKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTMzTUh6ICAgMHgwMDAwMDAxMCAvKiB0ZW1wIHdhcm4gMCBzZXR0aW5ncyAqLworI2RlZmluZSBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTAwTUh6CSAgICAweDAwMDJkYTAxCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMzNNSHoJICAgIDB4MDAwM2RlMDEgLyogNy44dXMvNy41bnMgLSA1MCA9IDB4M2RlICovCisjZGVmaW5lIFNEUF8yNFhYX1NEUkNfUkZSX0NUUkxfMTY1TUh6CSAgICAweDAwMDRlMjAxIC8qIDcuOHVzLzZucyAtIDUwID0gMHg0ZTIgKi8KKyNkZWZpbmUgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTAwTUh6ICAgICAgMHgwMDAwOTgwRSAvKiA5MGRlZywgYWxsb3cgRFBMTG91dCoxIHRvIHdvcmsgKGNvbWJvKSovCisjZGVmaW5lIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEzM01IeiAgICAgIDB4MDAwMDY5MEUgLyogOTBkZWcsIGZvciBFUzIgKi8KKyNkZWZpbmUgU0RQXzI0WFhfU0RSQ19ETExBQl9DVFJMXzE2NU1IeiAgICAgMHgwMDAwMTcwQyAvKiA3MmRlZywgY29kZSB3aWxsIHJlY2FsYyBkbGwgbG9hZCAqLworCisvKiBJbmZpbmVvbiBwYXJ0IG9mIDI0MzBTRFAgKDEzM01IeiBvcHRpbWl6ZWQpIH4gNy41bnMKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzcuNSArIDIyLjUvNy41ID0gMiArIDMgPSA1CisgKglURFBMID0gMTUvNy41CT0gMgorICoJVFJSRCA9IDE1LzIuNQk9IDIKKyAqCVRSQ0QgPSAyMi41LzcuNQk9IDMKKyAqCVRSUCA9IDIyLjUvNy41CT0gMworICoJVFJBUyA9IDQ1LzcuNQk9IDYKKyAqCVRSQyA9IDY1LzcuNQk9IDguNi0+OQorICoJVFJGQyA9IDc1LzcuNQk9IDEwCisgKiAgIEFDVElNQgorICoJVENLRSA9IDIJPG5ldyBpbiAyNDMwPgorICoJWFNSID0gMTIwLzcuNSA9IDE2CisgKi8KKyNkZWZpbmUgVERBTF8xMzMgICA1CisjZGVmaW5lIFREUExfMTMzICAgMgorI2RlZmluZSBUUlJEXzEzMyAgIDIKKyNkZWZpbmUgVFJDRF8xMzMgICAzCisjZGVmaW5lIFRSUF8xMzMgICAgMworI2RlZmluZSBUUkFTXzEzMyAgIDYKKyNkZWZpbmUgVFJDXzEzMyAgICA5CisjZGVmaW5lIFRSRkNfMTMzICAxMAorI2RlZmluZSBWX0FDVElNQV8xMzMgKChUUkZDXzEzMyA8PCAyNykgfCAoVFJDXzEzMyA8PCAyMikgfCAoVFJBU18xMzMgPDwgMTgpIHwoVFJQXzEzMyA8PCAxNSkgfCBcCisJCShUUkNEXzEzMyA8PCAxMikgfChUUlJEXzEzMyA8PCA5KSB8KFREUExfMTMzIDw8IDYpIHwgKFREQUxfMTMzKSkKKworI2RlZmluZSBUQ0tFXzEzMyAgIDIKKyNkZWZpbmUgWFNSXzEzMyAgIDE2CisjZGVmaW5lIFZfQUNUSU1CXzEzMyAoKFRDS0VfMTMzIDw8IDEyKSB8IChYU1JfMTMzIDw8IDApKQorCisvKiBJbmZpbmVvbiBwYXJ0IG9mIDI0MzBTRFAgKDE2NU1IeiBvcHRpbWl6ZWQpIDYuMDZucworICogICBBQ1RJTUEKKyAqCVREQUwgPSBUd3IvVGNrICsgVHJwL3RjayA9IDE1LzYgKyAxOC82ID0gMi41ICsgMyA9IDUuNSAtPiA2CisgKglURFBMIChUd3IpID0gMTUvNgk9IDIuNSAtPiAzCisgKglUUlJEID0gMTIvNgk9IDIKKyAqCVRSQ0QgPSAxOC82CT0gMworICoJVFJQID0gMTgvNgk9IDMKKyAqCVRSQVMgPSA0Mi82CT0gNworICoJVFJDID0gNjAvNgk9IDEwCisgKglUUkZDID0gNzIvNgk9IDEyCisgKiAgIEFDVElNQgorICoJVENLRSA9IDIJPG5ldyBpbiAyNDMwPgorICoJWFNSID0gMTIwLzYgPSAyMAorICovCisjZGVmaW5lIFREQUxfMTY1ICAgNgorI2RlZmluZSBURFBMXzE2NSAgIDMKKyNkZWZpbmUgVFJSRF8xNjUgICAyCisjZGVmaW5lIFRSQ0RfMTY1ICAgMworI2RlZmluZSBUUlBfMTY1ICAgIDMKKyNkZWZpbmUgVFJBU18xNjUgICA3CisjZGVmaW5lIFRSQ18xNjUgICAxMAorI2RlZmluZSBUUkZDXzE2NSAgMTIKKyNkZWZpbmUgVl9BQ1RJTUFfMTY1ICgoVFJGQ18xNjUgPDwgMjcpIHwgKFRSQ18xNjUgPDwgMjIpIHwgKFRSQVNfMTY1IDw8IDE4KSB8KFRSUF8xNjUgPDwgMTUpIHwgXAorCQkoVFJDRF8xNjUgPDwgMTIpIHwoVFJSRF8xNjUgPDwgOSkgfChURFBMXzE2NSA8PCA2KSB8IChUREFMXzE2NSkpCisKKyNkZWZpbmUgVENLRV8xNjUgICAyCisjZGVmaW5lIFhTUl8xNjUgICAyMAorI2RlZmluZSBWX0FDVElNQl8xNjUgKChUQ0tFXzE2NSA8PCAxMikgfCAoWFNSXzE2NSA8PCAwKSkKKworI2lmIGRlZmluZWQoUFJDTV9DT05GSUdfSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUIpCisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTAwTUh6CisjIGRlZmluZSBTRFBfMjQzMF9TRFJDX0FDVElNX0NUUkxBXzAgVl9BQ1RJTUFfMTMzCisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEJfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTAwTUh6CisjIGRlZmluZSBINF8yNDIwX1NEUkNfUkZSX0NUUkwgICAgICAgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEwME1IegorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgICAgIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEwME1IegorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19ETExBQl9DVFJMICAgIDB4MDAwMDczMEUKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQV8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEFfMF8xMDBNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19BQ1RJTV9DVFJMQl8wICBINF8yNDJYX1NEUkNfQUNUSU1fQ1RSTEJfMF8xMDBNSHoKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19SRlJfQ1RSTCAgICAgICBINF8yNDJYX1NEUkNfUkZSX0NUUkxfMTAwTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfRExMQUJfQ1RSTCAgICAgSDRfMjQyWF9TRFJDX0RMTEFCX0NUUkxfMTAwTUh6CisjZWxpZiBkZWZpbmVkKFBSQ01fQ09ORklHX0lJSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR18zKQorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxBXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQV8wXzEzM01IegorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19BQ1RJTV9DVFJMQV8wIFZfQUNUSU1BXzEzMworIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAgIEg0XzI0MlhfU0RSQ19BQ1RJTV9DVFJMQl8wXzEzM01IegorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX1JGUl9DVFJMICAgICAgIEg0XzI0MlhfU0RSQ19SRlJfQ1RSTF8xMzNNSHoKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19ETExBQl9DVFJMICAgICBINF8yNDJYX1NEUkNfRExMQUJfQ1RSTF8xMzNNSHoKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfRExMQUJfQ1RSTCAgICAweDAwMDA3MzBFCisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEFfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxBXzBfMTMzTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEJfMCAgSDRfMjQyWF9TRFJDX0FDVElNX0NUUkxCXzBfMTMzTUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfUkZSX0NUUkwgICAgICAgSDRfMjQyWF9TRFJDX1JGUl9DVFJMXzEzM01IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0RMTEFCX0NUUkwgICAgIEg0XzI0MlhfU0RSQ19ETExBQl9DVFJMXzEzM01IegorI2VsaWYgZGVmaW5lZChQUkNNX0NPTkZJR19JKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzIpCisjIGRlZmluZSBINF8yNDIwX1NEUkNfQUNUSU1fQ1RSTEFfMCAgVl9BQ1RJTUFfMTY1IAorIyBkZWZpbmUgU0RQXzI0MzBfU0RSQ19BQ1RJTV9DVFJMQV8wIFZfQUNUSU1BXzE2NQorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0FDVElNX0NUUkxCXzAgIFZfQUNUSU1CXzE2NSAKKyMgZGVmaW5lIEg0XzI0MjBfU0RSQ19SRlJfQ1RSTCAgICAgICBTRFBfMjRYWF9TRFJDX1JGUl9DVFJMXzE2NU1IegorIyBkZWZpbmUgSDRfMjQyMF9TRFJDX0RMTEFCX0NUUkwgICAgIFNEUF8yNFhYX1NEUkNfRExMQUJfQ1RSTF8xNjVNSHoKKyMgZGVmaW5lIFNEUF8yNDMwX1NEUkNfRExMQUJfQ1RSTCAgICBTRFBfMjRYWF9TRFJDX0RMTEFCX0NUUkxfMTY1TUh6CisjIGRlZmluZSBINF8yNDIyX1NEUkNfQUNUSU1fQ1RSTEFfMCAgVl9BQ1RJTUFfMTY1IAorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0FDVElNX0NUUkxCXzAgIFZfQUNUSU1CXzE2NSAKKyMgZGVmaW5lIEg0XzI0MjJfU0RSQ19SRlJfQ1RSTCAgICAgICBTRFBfMjRYWF9TRFJDX1JGUl9DVFJMXzE2NU1IegorIyBkZWZpbmUgSDRfMjQyMl9TRFJDX0RMTEFCX0NUUkwgICAgIFNEUF8yNFhYX1NEUkNfRExMQUJfQ1RSTF8xNjVNSHoKKyNlbmRpZgorCisvKgorICogR1BNQyBzZXR0aW5ncyAtCisgKiBEZWZpbml0aW9ucyBpcyBhcyBwZXIgdGhlIGZvbGxvd2luZyBmb3JtYXQKKyAqICMgZGVmaW5lIDxQQVJUPl9HUE1DX0NPTkZJRzx4PiA8dmFsdWU+CisgKiBXaGVyZToKKyAqIFBBUlQgaXMgdGhlIHBhcnQgbmFtZSBlLmcuIFNUTk9SIC0gSW50ZWwgU3RyYXRhIEZsYXNoCisgKiB4IGlzIEdQTUMgY29uZmlnIHJlZ2lzdGVycyBmcm9tIDEgdG8gNiAodGhlcmUgd2lsbCBiZSA2IG1hY3JvcykKKyAqIFZhbHVlIGlzIGNvcnJlc3BvbmRpbmcgdmFsdWUKKyAqCisgKiBGb3IgZXZlcnkgdmFsaWQgUFJDTSBjb25maWd1cmF0aW9uIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBkZWZpbml0aW9uIG9mIHRoZSBzYW1lLgorICogaWYgdmFsdWVzIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgYm9hcmQsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIGJlIHByZXNlbnQgaW4gdGhpcyBmaWxlCisgKiBpZiB2YWx1ZXMgYXJlIGRlcGVuZGVudCBvbiB0aGUgYm9hcmQsIHRoZW4gdGhpcyBzaG91bGQgZ28gaW50byBjb3JyZXNwb25kaW5nIG1lbS1ib2FyZE5hbWUuaCBmaWxlCisgKgorICogQ3VycmVudGx5IHZhbGlkIHBhcnQgTmFtZXMgYXJlIChQQVJUKToKKyAqIFNUTk9SIC0gSW50ZWwgU3RyYXRhIEZsYXNoCisgKiBTTU5BTkQgLSBTYW1zdW5nIE5BTkQKKyAqIE1QREIgLSBINCBNUERCIGJvYXJkCisgKiBTQk5PUiAtIFNpYmxleSBOT1IKKyAqIE9OTkFORCAtIFNhbXN1bmcgT25lIE5BTkQKKyAqCisgKiBpbmNsdWRlL2NvbmZpZ3MvZmlsZS5oIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZGVmbiAtIGZvciBhbGwgQ1Mgd2UgYXJlIGludGVyZXN0ZWQKKyAqICNkZWZpbmUgT01BUDI0WFhfR1BNQ19DU3ggUEFSVAorICogI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTeF9TSVpFIFNpemUKKyAqICNkZWZpbmUgT01BUDI0WFhfR1BNQ19DU3hfTUFQIE1hcAorICogV2hlcmU6CisgKiB4IC0gQ1MgbnVtYmVyCisgKiBQQVJUIC0gUGFydCBOYW1lIGFzIGRlZmluZWQgYWJvdmUKKyAqIFNJWkUgLSBob3cgYmlnIGlzIHRoZSBtYXBwaW5nIHRvIGJlCisgKiAgIEdQTUNfU0laRV8xMjhNIC0gMHg4CisgKiAgIEdQTUNfU0laRV82NE0gIC0gMHhDCisgKiAgIEdQTUNfU0laRV8zMk0gIC0gMHhFCisgKiAgIEdQTUNfU0laRV8xNk0gIC0gMHhGCisgKiBNQVAgIC0gTWFwIHRoaXMgQ1MgdG8gd2hpY2ggYWRkcmVzcyhHUE1DIGFkZHJlc3Mgc3BhY2UpLSBBYnNvbHV0ZSBhZGRyZXNzCisgKiAgID4+MjQgYmVmb3JlIGJlaW5nIHVzZWQuCisgKi8KKworI2RlZmluZSBHUE1DX1NJWkVfMjU2TSAgMHgwCisjZGVmaW5lIEdQTUNfU0laRV8xMjhNICAweDgKKyNkZWZpbmUgR1BNQ19TSVpFXzY0TSAgIDB4QworI2RlZmluZSBHUE1DX1NJWkVfMzJNICAgMHhFCisjZGVmaW5lIEdQTUNfU0laRV8xNk0gICAweEYKKworI2lmIGRlZmluZWQoUFJDTV9DT05GSUdfSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUIpIC8qIEwzIGF0IDEwME1IeiAqLworIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwQTgwCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMGYwZjAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNTA1MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgwQzA2MEMwNgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MCAgLyogMD8gTm90IGRlZmluZWQgc28gZmFyLi4uIHRoaXMgdmFsdWUgaXMgcmVzZXQgdmFsIGFzIHBlciBncG1jIGRvYyAqLworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgICAweDAwMDExMDAwCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMiAgIDB4MDAxRjFGMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAgMHgwMDA4MDgwMgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgICAweDFDMDkxQzA5CisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNSAgIDB4MDMxQTFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAgMHgwMDAwMDNDMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBSQ01fQ09ORklHX0lJSSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR181QSkgfHwgZGVmaW5lZChQUkNNX0NPTkZJR18zKSAvKiBMMyBhdCAxMzNNSHogKi8KKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMiAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUczIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzQgMHgwRjAxMEYwMQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNSAweDAxMEMxNDE0CisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDBBODAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMEM0NAorCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgxMDA4MTAwOAorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0YzQKKworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAweDAwMWYxZjAxCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAweDA0MWYxRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRDNAorCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzQgIDB4MTAwODEwMDgKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzUgIDB4MDExMzFGMUYKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDAwMDAKKworIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTIwMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzIgMHgwMDBjMGMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzMgMHgwMDAzMDMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzQgMHgwYzA0MGMwNAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTAxMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDAwMAorCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUcxIDB4MDFFOTEyMDAKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzIgMHgwMDFFMUUwMQorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMyAweDAwMDIwMjAzCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc0IDB4MUQwNDFEMDQKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzUgMHgwMzFEMUYxRgorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNiAweDAwMDAwNEM0CisjZW5kaWYgLyogZW5kaWYgQ0ZHX1BSQ01fSUlJICovCisKKyNpZiBkZWZpbmVkIChQUkNNX0NPTkZJR19JKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzIpIC8qIEwzIGF0IDE2NU1IeiAqLworIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMEE4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwQzQ0CisKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMSAgMHgzCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzIgIDB4MDAxNTE1MDEKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc0ICAweDExMDkxMTA5CisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzUgIDB4MDExNDFGMUYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDRjNAorCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAweDAwMDgwODAzCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgMHgxYzBiMWMwYQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgIDB4MDQxZjFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAweDAwMDAwNEM0CisKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA2MDYwMgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNCAgMHgxMTA5MTEwOQorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNSAgMHgwMTE0MUYxRgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDAwMAorCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxMjAwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMiAweDAwMEYwRjAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHMyAweDAwMDMwMzAxCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNCAweDBGMDQwRjA0CisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNSAweDAxMEYxMDEwCisjIGRlZmluZSBPTkVOQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwMDAwCisKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzEgMHgwMUU5MTIwMAorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHMiAweDAwMUUxRTAxCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUczIDB4MDAwMjAyMDMKKyMgZGVmaW5lIFBDTUNJQV9HUE1DX0NPTkZJRzQgMHgxRDA0MUQwNAorIyBkZWZpbmUgUENNQ0lBX0dQTUNfQ09ORklHNSAweDAzMUQxRjFGCisjIGRlZmluZSBQQ01DSUFfR1BNQ19DT05GSUc2IDB4MDAwMDA0QzQKKworI2VuZGlmCisKKyNpZiAwCisvKiBCb2FyZCBTcGVjaWZpYyBTZXR0aW5ncyBmb3IgZWFjaCBvZiB0aGUgY29uZmlndXJhdGlvbnMgZm9yIGNoaXBzCisgKiB3aG9zZSB2YWx1ZXMgY2hhbmdlIGFzIHBlciBwbGF0Zm9ybS4gLSBOb25lIGN1cnJlbnRseQorICovCisjaWYgQ09ORklHX09NQVAyNFhYSDQKKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0taDQuaD4KKyNlbmRpZgorCisjaWYgQ09ORklHXzI0MzBTRFAKKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0tc2RwMjQzMC5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiBpZiAwICovCisKKy8qIG1heCBudW1iZXIgb2YgR1BNQyBDaGlwIFNlbGVjdHMgKi8KKyNkZWZpbmUgR1BNQ19NQVhfQ1MgICAgOAorLyogbWF4IG51bWJlciBvZiBHUE1DIHJlZ3MgKi8KKyNkZWZpbmUgR1BNQ19NQVhfUkVHICAgNworCisjZGVmaW5lIFBST0NfTk9SICAgICAgIDEKKyNkZWZpbmUgUFJPQ19OQU5EICAgICAgMgorI2RlZmluZSBQSVNNT19TSUJMRVkwICAzCisjZGVmaW5lIFBJU01PX1NJQkxFWTEgIDQKKyNkZWZpbmUgUElTTU9fT05FTkFORCAgNQorI2RlZmluZSBEQkdfTVBEQiAgICAgICA2CisjZGVmaW5lIFBJU01PX1BDTUNJQSAgIDcKKworLyogbWFrZSBpdCByZWFkYWJsZSBmb3IgdGhlIGdwbWNfaW5pdCAqLworI2RlZmluZSBQUk9DX05PUl9CQVNFICAgCUZMQVNIX0JBU0UKKyNkZWZpbmUgUFJPQ19OQU5EX0JBU0UgIAlOQU5EX0JBU0UKKyNkZWZpbmUgUElTTU9fU0lCMF9CQVNFIAlTSUJMRVlfTUFQMQorI2RlZmluZSBQSVNNT19TSUIxX0JBU0UgCVNJQkxFWV9NQVAyCisjZGVmaW5lIFBJU01PX09ORU5fQkFTRSAJT05FTkFORF9NQVAKKyNkZWZpbmUgREJHX01QREJfQkFTRSAgIAlERUJVR19CQVNFCisjZGVmaW5lIFBJU01PX1BDTUNJQV9CQVNFICAJUENNQ0lBX0JBU0UKKworI2VuZGlmIC8qIGVuZGlmIF9PTUFQMjRYWF9NRU1fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQyMC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllNjc5ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9vbWFwMjQyMC5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMjQyMF9TWVNfSF8KKyNkZWZpbmUgX09NQVAyNDIwX1NZU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyoKKyAqIDI0MjAgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qIENPTlRST0wgKi8KKyNkZWZpbmUgT01BUDI0MjBfQ1RSTF9CQVNFICAgICgweDQ4MDAwMDAwKQorI2RlZmluZSBDT05UUk9MX1NUQVRVUyAgICAgICAgKE9NQVAyNDIwX0NUUkxfQkFTRSArIDB4MkY4KQorCisvKiBUQVAgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgT01BUDI0MjBfVEFQX0JBU0UgICAgICgweDQ4MDE0MDAwKQorI2RlZmluZSBUQVBfSURDT0RFX1JFRyAgICAgICAgKE9NQVAyNDIwX1RBUF9CQVNFKzB4MjA0KQorCisvKiBHUE1DICovCisjZGVmaW5lIE9NQVAyNDIwX0dQTUNfQkFTRSAgICAoMHg2ODAwQTAwMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUcgICAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHgxMCkKKyNkZWZpbmUgR1BNQ19TWVNTVEFUVVMJICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDE0KQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRSAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDFDKQorI2RlZmluZSBHUE1DX1RJTUVPVVRfQ09OVFJPTCAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDQwKQorI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX0NPTkZJRzFfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDYwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDY0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDY4KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDZDKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDcwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMCAgICAgICAgKE9NQVAyNDIwX0dQTUNfQkFTRSsweDc0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMAkgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4NzgpCisjZGVmaW5lIEdQTUNfQ09ORklHMV8xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4OTApCisjZGVmaW5lIEdQTUNfQ09ORklHMl8xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4OTQpCisjZGVmaW5lIEdQTUNfQ09ORklHM18xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4OTgpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4OUMpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4QTApCisjZGVmaW5lIEdQTUNfQ09ORklHNl8xICAgICAgICAoT01BUDI0MjBfR1BNQ19CQVNFKzB4QTQpCisjZGVmaW5lIEdQTUNfQ09ORklHN18xCSAgICAgIChPTUFQMjQyMF9HUE1DX0JBU0UrMHhBOCkKKworLyogU01TICovCisjZGVmaW5lIE9NQVAyNDIwX1NNU19CQVNFIDB4NjgwMDgwMDAKKyNkZWZpbmUgU01TX1NZU0NPTkZJRyAgICAgKE9NQVAyNDIwX1NNU19CQVNFKzB4MTApCisKKy8qIFNEUkMgKi8KKyNkZWZpbmUgT01BUDI0MjBfU0RSQ19CQVNFIDB4NjgwMDkwMDAKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUcgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHgxMCkKKyNkZWZpbmUgU0RSQ19TVEFUVVMgICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHgxNCkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg0NCkKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkwgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg2MCkKKyNkZWZpbmUgU0RSQ19ETExBX1NUQVRVUyAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg2NCkKKyNkZWZpbmUgU0RSQ19ETExCX0NUUkwgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg2OCkKKyNkZWZpbmUgU0RSQ19QT1dFUiAgICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg3MCkKKyNkZWZpbmUgU0RSQ19NQ0ZHXzAgICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg4MCkKKyNkZWZpbmUgU0RSQ19NUl8wICAgICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg4NCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV8wIChPTUFQMjQyMF9TRFJDX0JBU0UrMHg5QykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8wIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhBMCkKKyNkZWZpbmUgU0RSQ19NQ0ZHXzEgICAgICAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhCMCkKKyNkZWZpbmUgU0RSQ19NUl8xCSAgIChPTUFQMjQyMF9TRFJDX0JBU0UrMHhCNCkKKyNkZWZpbmUgU0RSQ19FTVIyXzEJICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEJDKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBXzEgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEM0KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCXzEgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEM4KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEE0KQorI2RlZmluZSBTRFJDX01BTlVBTF8wICAgICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEE4KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMMQkgICAoT01BUDI0MjBfU0RSQ19CQVNFKzB4RDQpCisjZGVmaW5lIFNEUkNfTUFOVUFMXzEJICAgKE9NQVAyNDIwX1NEUkNfQkFTRSsweEQ4KQorCisjZGVmaW5lIE9NQVAyNDIwX1NEUkNfQ1MwICAweDgwMDAwMDAwCisjZGVmaW5lIE9NQVAyNDIwX1NEUkNfQ1MxICAweEEwMDAwMDAwCisKKyNkZWZpbmUgTE9BRERMTCAgICAgICAgICAgIEJJVDIKKyNkZWZpbmUgQ01EX05PUCAgICAgICAgICAgIDB4MAorI2RlZmluZSBDTURfUFJFQ0hBUkdFICAgICAgMHgxCisjZGVmaW5lIENNRF9BVVRPUkVGUkVTSCAgICAweDIKKyNkZWZpbmUgQ01EX0VOVFJfUFdSRE9XTiAgIDB4MworI2RlZmluZSBDTURfRVhJVF9QV1JET1dOICAgMHg0CisjZGVmaW5lIENNRF9FTlRSX1NSRlJTSCAgICAweDUKKyNkZWZpbmUgQ01EX0NLRV9ISUdIICAgICAgIDB4NgorI2RlZmluZSBDTURfQ0tFX0xPVyAgICAgICAgMHg3CisjZGVmaW5lIFNPRlRSRVNFVCAgICAgICAgICBCSVQxCisjZGVmaW5lIFNNQVJUX0lETEUgICAgICAgICAoMHgyIDw8IDMpCisjZGVmaW5lIFJFRl9PTl9JRExFICAgICAgICAoMHgxIDw8IDYpCisKKworLyogVUFSVCAqLworI2RlZmluZSBPTUFQMjQyMF9VQVJUMQkgICAgICAweDQ4MDZBMDAwCisjZGVmaW5lIE9NQVAyNDIwX1VBUlQyCSAgICAgIDB4NDgwNkMwMDAKKyNkZWZpbmUgT01BUDI0MjBfVUFSVDMgICAgICAgIDB4NDgwNkUwMDAKKworLyogR2VuZXJhbCBQdXJwb3NlIFRpbWVycyAqLworI2RlZmluZSBPTUFQMjQyMF9HUFQxICAgICAgICAgMHg0ODAyODAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQyICAgICAgICAgMHg0ODAyQTAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQzICAgICAgICAgMHg0ODA3ODAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ0ICAgICAgICAgMHg0ODA3QTAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ1ICAgICAgICAgMHg0ODA3QzAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ2ICAgICAgICAgMHg0ODA3RTAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ3ICAgICAgICAgMHg0ODA4MDAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ4ICAgICAgICAgMHg0ODA4MjAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQ5ICAgICAgICAgMHg0ODA4NDAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQxMCAgICAgICAgMHg0ODA4NjAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQxMSAgICAgICAgMHg0ODA4ODAwMAorI2RlZmluZSBPTUFQMjQyMF9HUFQxMiAgICAgICAgMHg0ODA4QTAwMAorCisvKiB0aW1lciByZWdzIG9mZnNldHMgKDMyIGJpdCByZWdzKSAqLworI2RlZmluZSBUSURSICAgICAgIDB4MCAgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElPQ1BfQ0ZHICAweDEwICAgICAvKiBydyAqLworI2RlZmluZSBUSVNUQVQgICAgIDB4MTQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElTUiAgICAgICAweDE4ICAgICAvKiBydyAqLworI2RlZmluZSBUSUVSICAgICAgIDB4MUMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXRVIgICAgICAgMHgyMCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENMUiAgICAgICAweDI0ICAgICAvKiBydyAqLworI2RlZmluZSBUQ1JSICAgICAgIDB4MjggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRMRFIgICAgICAgMHgyQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFRHUiAgICAgICAweDMwICAgICAvKiBydyAqLworI2RlZmluZSBUV1BTICAgICAgIDB4MzQgICAgIC8qIHIgKi8KKyNkZWZpbmUgVE1BUiAgICAgICAweDM4ICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMSAgICAgIDB4M2MgICAgIC8qIHIgKi8KKyNkZWZpbmUgVFNJQ1IgICAgICAweDQwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0FSMiAgICAgIDB4NDQgICAgIC8qIHIgKi8KKworLyogV2F0Y2hEb2cgVGltZXJzICgxIHNlY3VyZSwgMyBHUCkgKi8KKyNkZWZpbmUgV0QxX0JBU0UgICAgICAgICAgICAgIDB4NDgwMjAwMDAKKyNkZWZpbmUgV0QyX0JBU0UgICAgICAgICAgICAgIDB4NDgwMjIwMDAKKyNkZWZpbmUgV0QzX0JBU0UgICAgICAgICAgICAgIDB4NDgwMjQwMDAKKyNkZWZpbmUgV0Q0X0JBU0UgICAgICAgICAgICAgIDB4NDgwMjYwMDAKKyNkZWZpbmUgV1dQUyAgICAgICAweDM0ICAgICAvKiByICovCisjZGVmaW5lIFdTUFIgICAgICAgMHg0OCAgICAgLyogcncgKi8KKyNkZWZpbmUgV0RfVU5MT0NLMSAweEFBQUEKKyNkZWZpbmUgV0RfVU5MT0NLMiAweDU1NTUKKworLyogUFJDTSAqLworI2RlZmluZSBPTUFQMjQyMF9DTV9CQVNFIDB4NDgwMDgwMDAKKyNkZWZpbmUgUFJDTV9DTEtDRkdfQ1RSTCAoT01BUDI0MjBfQ01fQkFTRSsweDA4MCkKKyNkZWZpbmUgQ01fQ0xLU0VMX01QVSAgICAoT01BUDI0MjBfQ01fQkFTRSsweDE0MCkKKyNkZWZpbmUgQ01fRkNMS0VOMV9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDIwMCkKKyNkZWZpbmUgQ01fRkNMS0VOMl9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDIwNCkKKyNkZWZpbmUgQ01fSUNMS0VOMV9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDIxMCkKKyNkZWZpbmUgQ01fSUNMS0VOMl9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDIxNCkKKyNkZWZpbmUgQ01fQ0xLU0VMMV9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDI0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMX1dLVVAgICAoT01BUDI0MjBfQ01fQkFTRSsweDQ0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMMl9DT1JFICAoT01BUDI0MjBfQ01fQkFTRSsweDI0NCkKKyNkZWZpbmUgQ01fQ0xLU0VMX0dGWCAgICAoT01BUDI0MjBfQ01fQkFTRSsweDM0MCkKKyNkZWZpbmUgUE1fUlNUQ1RSTF9XS1VQICAoT01BUDI0MjBfQ01fQkFTRSsweDQ1MCkKKyNkZWZpbmUgQ01fQ0xLRU5fUExMICAgICAoT01BUDI0MjBfQ01fQkFTRSsweDUwMCkKKyNkZWZpbmUgQ01fSURMRVNUX0NLR0VOICAoT01BUDI0MjBfQ01fQkFTRSsweDUyMCkKKyNkZWZpbmUgQ01fQ0xLU0VMMV9QTEwgICAoT01BUDI0MjBfQ01fQkFTRSsweDU0MCkKKyNkZWZpbmUgQ01fQ0xLU0VMMl9QTEwgICAoT01BUDI0MjBfQ01fQkFTRSsweDU0NCkKKyNkZWZpbmUgQ01fQ0xLU0VMX0RTUCAgICAoT01BUDI0MjBfQ01fQkFTRSsweDg0MCkKKworLyoKKyAqIEg0IHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKgorICogIFRoZSAyNDIwJ3MgY2hpcCBzZWxlY3RzIGFyZSBwcm9ncmFtbWFibGUuICBUaGUgbWFzayBST00KKyAqICBkb2VzIGNvbmZpZ3VyZSBDUzAgdG8gMHgwODAwMDAwMCBiZWZvcmUgZGlzcGF0Y2guICBTbywgaWYKKyAqICB5b3Ugd2FudCB5b3VyIGNvZGUgdG8gbGl2ZSBiZWxvdyB0aGF0IGFkZHJlc3MsIHlvdSBoYXZlIHRvCisgKiAgYmUgcHJlcGFyZWQgdG8ganVtcCB0aG91Z2ggaG9vcHMsIHRvIHJlc2V0IHRoZSBiYXNlIGFkZHJlc3MuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQMjQyMEg0KQorLyogR1BNQyAqLworI2lmZGVmIENPTkZJR19WSVJUSU9fQSAgICAgICAgLyogUHJlIHZlcnNpb24gQiAqLworIyBkZWZpbmUgSDRfQ1MwX0JBU0UgICAgICAgICAgIDB4MDgwMDAwMDAgIC8qIGZsYXNoICg2NCBNZWcgYWxpZ25lZCkgKi8KKyMgZGVmaW5lIEg0X0NTMV9CQVNFICAgICAgICAgICAweDA0MDAwMDAwICAvKiBkZWJ1ZyBib2FyZCAqLworIyBkZWZpbmUgSDRfQ1MyX0JBU0UgICAgICAgICAgIDB4MEEwMDAwMDAgIC8qIHdpZmkgYm9hcmQgKi8KKyNlbHNlCisjIGRlZmluZSBINF9DUzBfQkFTRSAgICAgICAgICAgMHgwNDAwMDAwMCAgLyogZmxhc2ggKDY0IE1lZyBhbGlnbmVkKSAqLworIyBkZWZpbmUgSDRfQ1MxX0JBU0UgICAgICAgICAgIDB4MDgwMDAwMDAgIC8qIGRlYnVnIGJvYXJkICovCisjIGRlZmluZSBINF9DUzJfQkFTRSAgICAgICAgICAgMHgwQTAwMDAwMCAgLyogd2lmaSBib2FyZCAqLworI2VuZGlmCisKKy8qIGJhc2UgYWRkcmVzcyBmb3IgaW5kaXJlY3QgdmVjdG9ycyAoaW50ZXJuYWwgYm9vdCBtb2RlKSAqLworI2RlZmluZSBTUkFNX09GRlNFVDAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDEgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDIgICAgICAgICAgMHgwMDAwRjgwMAorI2RlZmluZSBTUkFNX1ZFQ1RfQ09ERSAgICAgICAoU1JBTV9PRkZTRVQwfFNSQU1fT0ZGU0VUMXxTUkFNX09GRlNFVDIpCisKKyNkZWZpbmUgTE9XX0xFVkVMX1NSQU1fU1RBQ0sgIDB4NDAyMEZGRkMKKworI2RlZmluZSBQRVJJRkVSQUxfUE9SVF9CQVNFICAgMHg0ODBGRTAwMworCisvKiBGUEdBIG9uIERlYnVnIGJvYXJkLiovCisjZGVmaW5lIEVUSF9DT05UUk9MX1JFRyAgICAgICAoSDRfQ1MxX0JBU0UrMHgzMGIpCisjZGVmaW5lIExBTl9SRVNFVF9SRUdJU1RFUiAgICAoSDRfQ1MxX0JBU0UrMHgxYykKKyNlbmRpZiAgLyogZW5kaWYgQ09ORklHXzI0MjBINCAqLworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDMwLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvb21hcDI0MzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI4OGFhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L29tYXAyNDMwLmgKQEAgLTAsMCArMSwyNDYgQEAKKy8qIAorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMjQzMF9TWVNfSF8KKyNkZWZpbmUgX09NQVAyNDMwX1NZU19IXworCisjaW5jbHVkZSA8YXNtL2FyY2gvc2l6ZXMuaD4KKworLyogZGV2aWNlIHR5cGUgKi8KKyNkZWZpbmUgREVWSUNFX01BU0sgICAgICAgICAgKEJJVDh8QklUOXxCSVQxMCkKKyNkZWZpbmUgVFNUX0RFVklDRSAgICAgICAgICAgMHgwCisjZGVmaW5lIEVNVV9ERVZJQ0UgICAgICAgICAgIDB4MQorI2RlZmluZSBIU19ERVZJQ0UgICAgICAgICAgICAweDIKKyNkZWZpbmUgR1BfREVWSUNFICAgICAgICAgICAgMHgzCisKKy8qCisgKiAyNDMwIHNwZWNpZmljIFNlY3Rpb24KKyAqLworI2RlZmluZSBPTUFQMjQzWF9DT1JFX0w0X0lPX0JBU0UgICAgICAgIDB4NDgwMDAwMDAKKyNkZWZpbmUgT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UgICAgICAweDQ5MDAwMDAwCisjZGVmaW5lIE9NQVAyNFhYX0w0X0lPX0JBU0UgICAgIE9NQVAyNDNYX0NPUkVfTDRfSU9fQkFTRQorCisKKy8qIENPTlRST0wgKi8KKyNkZWZpbmUgT01BUDI0WFhfQ1RSTF9CQVNFICAgIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDIwMDApCisjZGVmaW5lIENPTlRST0xfU1RBVFVTICAgICAgICAoT01BUDI0WFhfQ1RSTF9CQVNFICsgMHgyRjgpCisKKy8qIFRBUCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBPTUFQMjRYWF9UQVBfQkFTRSAgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4QTAwMCkKKyNkZWZpbmUgVEFQX0lEQ09ERV9SRUcgICAgICAgIChPTUFQMjRYWF9UQVBfQkFTRSsweDIwNCkKKworLyogCisJR1BNQyA6IEluIDI0MzAgTk9SIGFuZCBOQU5EIGNhbiBjb2V4aXN0LgorCUR1cmluZyBOQU5EIGJvb3RpbmcgLCBOQU5EIGlzIGF0IENTMCBhbmQgTk9SIGF0IENTMQorCWFuZCBEZWJ1ZyBGUEdBIGlzIEdQTUNfQ1M1IAorKi8KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19CQVNFICAgICgweDZFMDAwMDAwKQorCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTApCisjZGVmaW5lIEdQTUNfU1lTU1RBVFVTCSAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxQykKKyNkZWZpbmUgR1BNQ19USU1FT1VUX0NPTlRST0wgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg0MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcgICAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg2MCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg2NCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg2OCkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg2QykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg3MCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzAgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHg3NCkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzAJICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDc4KQorI2RlZmluZSBHUE1DX0NPTkZJRzFfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDkwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDk0KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDk4KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDlDKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweEEwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweEE0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMQkgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4QTgpCisjZGVmaW5lIEdQTUNfQ09ORklHMV81ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTUwKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE1NCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNTgpCisjZGVmaW5lIEdQTUNfQ09ORklHNF81ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTVDKQorI2RlZmluZSBHUE1DX0NPTkZJRzVfNSAgICAgICAgKE9NQVAyNFhYX0dQTUNfQkFTRSsweDE2MCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzUgICAgICAgIChPTUFQMjRYWF9HUE1DX0JBU0UrMHgxNjQpCisjZGVmaW5lIEdQTUNfQ09ORklHN181ICAgICAgICAoT01BUDI0WFhfR1BNQ19CQVNFKzB4MTY4KQorCisKKy8qIFNNUyAqLworI2RlZmluZSBPTUFQMjRYWF9TTVNfQkFTRSAweDZDMDAwMDAwCisjZGVmaW5lIFNNU19TWVNDT05GSUcgICAgIChPTUFQMjRYWF9TTVNfQkFTRSsweDEwKQorCisvKiBTRFJDICovCisjZGVmaW5lIE9NQVAyNFhYX1NEUkNfQkFTRSAweDZEMDAwMDAwCisjZGVmaW5lIE9NQVAyNFhYX1NEUkNfQ1MwICAweDgwMDAwMDAwCisjZGVmaW5lIE9NQVAyNFhYX1NEUkNfQ1MxICAweEEwMDAwMDAwCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4MTApCisjZGVmaW5lIFNEUkNfU1RBVFVTICAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4MTQpCisjZGVmaW5lIFNEUkNfU0hBUklORyAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4NDQpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4NjApCisjZGVmaW5lIFNEUkNfRExMQV9TVEFUVVMgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4NjQpCisjZGVmaW5lIFNEUkNfRExMQl9DVFJMICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4NjgpCisjZGVmaW5lIFNEUkNfUE9XRVIgICAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4NzApCisjZGVmaW5lIFNEUkNfTUNGR18wICAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4ODApCisjZGVmaW5lIFNEUkNfTVJfMCAgICAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4ODQpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMCAoT01BUDI0WFhfU0RSQ19CQVNFKzB4OUMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMCAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QTApCisjZGVmaW5lIFNEUkNfTUNGR18xICAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QjApCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMSAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QzQpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfMSAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QzgpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkwgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QTQpCisjZGVmaW5lIFNEUkNfTUFOVUFMXzAgICAgICAoT01BUDI0WFhfU0RSQ19CQVNFKzB4QTgpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkwxCSAgIChPTUFQMjRYWF9TRFJDX0JBU0UrMHhENCkKKworI2RlZmluZSBMT0FERExMICAgICAgICAgICAgQklUMgorI2RlZmluZSBDTURfTk9QICAgICAgICAgICAgMHgwCisjZGVmaW5lIENNRF9QUkVDSEFSR0UgICAgICAweDEKKyNkZWZpbmUgQ01EX0FVVE9SRUZSRVNIICAgIDB4MgorI2RlZmluZSBDTURfRU5UUl9QV1JET1dOICAgMHgzCisjZGVmaW5lIENNRF9FWElUX1BXUkRPV04gICAweDQKKyNkZWZpbmUgQ01EX0VOVFJfU1JGUlNIICAgIDB4NQorI2RlZmluZSBDTURfQ0tFX0hJR0ggICAgICAgMHg2CisjZGVmaW5lIENNRF9DS0VfTE9XICAgICAgICAweDcKKyNkZWZpbmUgU09GVFJFU0VUICAgICAgICAgIEJJVDEKKyNkZWZpbmUgU01BUlRfSURMRSAgICAgICAgICgweDIgPDwgMykKKyNkZWZpbmUgUkVGX09OX0lETEUgICAgICAgICgweDEgPDwgNikKKworCisvKiBVQVJUICovCisjZGVmaW5lIE9NQVAyNDMwX1VBUlQxCSAgICAgIDB4NDgwNkEwMDAKKyNkZWZpbmUgT01BUDI0MzBfVUFSVDIJICAgICAgMHg0ODA2QzAwMAorI2RlZmluZSBPTUFQMjQzMF9VQVJUMyAgICAgICAgMHg0ODA2RTAwMAorCisvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXJzICovCisjZGVmaW5lIE9NQVAyNFhYX0dQVDEgICAgICAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgxODAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUMiAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4MkEwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDMgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDc4MDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ0ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg3QTAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUNSAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4N0MwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDYgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDdFMDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQ3ICAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4MDAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUOCAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4ODIwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDkgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDg0MDAwKQorI2RlZmluZSBPTUFQMjRYWF9HUFQxMCAgICAgICAgKE9NQVAyNFhYX0w0X0lPX0JBU0UrMHg4NjAwMCkKKyNkZWZpbmUgT01BUDI0WFhfR1BUMTEgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4ODgwMDApCisjZGVmaW5lIE9NQVAyNFhYX0dQVDEyICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDhBMDAwCisKKy8qIHRpbWVyIHJlZ3Mgb2Zmc2V0cyAoMzIgYml0IHJlZ3MpICovCisjZGVmaW5lIFRJRFIgICAgICAgMHgwICAgICAgLyogciAqLworI2RlZmluZSBUSU9DUF9DRkcgIDB4MTAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJU1RBVCAgICAgMHgxNCAgICAgLyogciAqLworI2RlZmluZSBUSVNSICAgICAgIDB4MTggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRJRVIgICAgICAgMHgxQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdFUiAgICAgICAweDIwICAgICAvKiBydyAqLworI2RlZmluZSBUQ0xSICAgICAgIDB4MjQgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDUlIgICAgICAgMHgyOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVExEUiAgICAgICAweDJDICAgICAvKiBydyAqLworI2RlZmluZSBUVEdSICAgICAgIDB4MzAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRXUFMgICAgICAgMHgzNCAgICAgLyogciAqLworI2RlZmluZSBUTUFSICAgICAgIDB4MzggICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIxICAgICAgMHgzYyAgICAgLyogciAqLworI2RlZmluZSBUU0lDUiAgICAgIDB4NDAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDQVIyICAgICAgMHg0NCAgICAgLyogciAqLworCisvKiBXYXRjaERvZyBUaW1lcnMgKDEgc2VjdXJlLCAzIEdQKSAqLworI2RlZmluZSBXRDFfQkFTRSAgICAgICAgICAgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MTQwMDApCisjZGVmaW5lIFdEMl9CQVNFICAgICAgICAgICAgICAoT01BUDI0M1hfV0FLRVVQX0w0X0lPX0JBU0UrMHgxNjAwMCkKKyNkZWZpbmUgV0QzX0JBU0UgICAgICAgICAgICAgIChPTUFQMjRYWF9MNF9JT19CQVNFKzB4MjQwMDApIC8qIG5vdCBwcmVzZW50ICovCisjZGVmaW5lIFdENF9CQVNFICAgICAgICAgICAgICAoT01BUDI0WFhfTDRfSU9fQkFTRSsweDI2MDAwKQorCisvKiAzMktUSU1FUiAqLworI2RlZmluZSBTWU5DXzMyS1RJTUVSX0JBU0UgICAgKE9NQVAyNDNYX1dBS0VVUF9MNF9JT19CQVNFKzB4MjAwMDApCisjZGVmaW5lIFMzMktfQ1IgICAgICAgICAgICAgICAoU1lOQ18zMktUSU1FUl9CQVNFKzB4MTApCisKKyNkZWZpbmUgV1dQUyAgICAgICAweDM0ICAgICAvKiByICovCisjZGVmaW5lIFdTUFIgICAgICAgMHg0OCAgICAgLyogcncgKi8KKyNkZWZpbmUgV0RfVU5MT0NLMSAweEFBQUEKKyNkZWZpbmUgV0RfVU5MT0NLMiAweDU1NTUKKworLyogUFJDTSAqLworI2RlZmluZSBPTUFQMjRYWF9DTV9CQVNFIChPTUFQMjQzWF9XQUtFVVBfTDRfSU9fQkFTRSsweDA2MDAwKQorCisjZGVmaW5lIFBSQ01fQ0xLU1JDX0NUUkwgKE9NQVAyNFhYX0NNX0JBU0UrMHgwNjApCisjZGVmaW5lIFBSQ01fQ0xLT1VUX0NUUkwgKE9NQVAyNFhYX0NNX0JBU0UrMHgwNzApCisjZGVmaW5lIFBSQ01fQ0xLRU1VTF9DVFJMIChPTUFQMjRYWF9DTV9CQVNFKzB4MDc4KQorI2RlZmluZSBQUkNNX0NMS0NGR19DVFJMIChPTUFQMjRYWF9DTV9CQVNFKzB4MDgwKQorI2RlZmluZSBQUkNNX0NMS0NGR19TVEFUVVMgKE9NQVAyNFhYX0NNX0JBU0UrMHgwODQpCisjZGVmaW5lIENNX0NMS1NFTF9NUFUgICAgKE9NQVAyNFhYX0NNX0JBU0UrMHgxNDApCisjZGVmaW5lIENNX0ZDTEtFTjFfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyMDApCisjZGVmaW5lIENNX0ZDTEtFTjJfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyMDQpCisjZGVmaW5lIENNX0lDTEtFTjFfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyMTApCisjZGVmaW5lIENNX0lDTEtFTjJfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyMTQpCisjZGVmaW5lIENNX0NMS1NFTDFfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyNDApCisjZGVmaW5lIENNX0NMS1NFTF9XS1VQICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg0NDApCisjZGVmaW5lIENNX0NMS1NFTDJfQ09SRSAgKE9NQVAyNFhYX0NNX0JBU0UrMHgyNDQpCisjZGVmaW5lIENNX0ZDTEtFTl9HRlggICAgKE9NQVAyNFhYX0NNX0JBU0UrMHgzMDApCisjZGVmaW5lIENNX0lDTEtFTl9HRlggICAgKE9NQVAyNFhYX0NNX0JBU0UrMHgzMTApCisjZGVmaW5lIENNX0NMS1NFTF9HRlggICAgKE9NQVAyNFhYX0NNX0JBU0UrMHgzNDApCisjZGVmaW5lIFJNX1JTVENUUkxfR0ZYICAgIChPTUFQMjRYWF9DTV9CQVNFKzB4MzUwKQorI2RlZmluZSBDTV9GQ0xLRU5fV0tVUCAgICAoT01BUDI0WFhfQ01fQkFTRSsweDQwMCkKKyNkZWZpbmUgQ01fSUNMS0VOX1dLVVAgICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg0MTApCisjZGVmaW5lIFBNX1JTVENUUkxfV0tVUCAgKE9NQVAyNFhYX0NNX0JBU0UrMHg0NTApCisjZGVmaW5lIENNX0NMS0VOX1BMTCAgICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg1MDApCisjZGVmaW5lIENNX0lETEVTVF9DS0dFTiAgKE9NQVAyNFhYX0NNX0JBU0UrMHg1MjApCisjZGVmaW5lIENNX0NMS1NFTDFfUExMICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg1NDApCisjZGVmaW5lIENNX0NMS1NFTDJfUExMICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg1NDQpCisjZGVmaW5lIENNX0NMS1NFTF9EU1AgICAgKE9NQVAyNFhYX0NNX0JBU0UrMHg4NDApCisjZGVmaW5lIENNX0NMS1NFTF9NRE0gICAgKE9NQVAyNFhYX0NNX0JBU0UrMHhDNDApCisKKy8qIFNNWC1BUEUgKi8KKyNkZWZpbmUgU01YX0FQRV9CQVNFIDB4NjgwMDAwMDAKKyNkZWZpbmUgUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gIChTTVhfQVBFX0JBU0UgKyAweDEwMDAwKQorI2RlZmluZSBQTV9HUE1DX0JBU0VfQUREUl9BUk0gICAgKFNNWF9BUEVfQkFTRSArIDB4MTI0MDApCisjZGVmaW5lIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSAoU01YX0FQRV9CQVNFICsgMHgxMjgwMCkKKyNkZWZpbmUgUE1fT0NNX1JPTV9CQVNFX0FERFJfQVJNIChTTVhfQVBFX0JBU0UgKyAweDEyQzAwKQorCisvKiBJVkEyICovCisjZGVmaW5lIFBNX0lWQTJfQkFTRV9BRERSX0FSTSAgICAoU01YX0FQRV9CQVNFICsgMHgxNDAwMCkKKworLyoKKyAqICBUaGUgMjQzMCdzIGNoaXAgc2VsZWN0cyBhcmUgcHJvZ3JhbW1hYmxlLiAgVGhlIG1hc2sgUk9NCisgKiAgZG9lcyBjb25maWd1cmUgQ1MwIHRvIDB4MDgwMDAwMDAgYmVmb3JlIGRpc3BhdGNoLiAgU28sIGlmCisgKiAgeW91IHdhbnQgeW91ciBjb2RlIHRvIGxpdmUgYmVsb3cgdGhhdCBhZGRyZXNzLCB5b3UgaGF2ZSB0bworICogIGJlIHByZXBhcmVkIHRvIGp1bXAgdGhvdWdoIGhvb3BzLCB0byByZXNldCB0aGUgYmFzZSBhZGRyZXNzLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfT01BUDI0M1gpCisKKy8qIEdQTUMgKi8KKy8qIFRoaXMgaXMgYmVpbmcgdXNlZCBieSB0aGUgbWFjcm9zIGluIG1lbS5oLiBQSFlTX0ZMQVNIXzEgaXMgZGVmaW5lZCB0byBINF9DUzBfQkFTRSAqLworIyBkZWZpbmUgSDRfQ1MxX0JBU0UgICAgICAgICAgIDB4MDkwMDAwMDAgIC8qIGZsYXNoICg2NCBNZWcgYWxpZ25lZCkgKi8KKyNkZWZpbmUgQ0ZHX0ZMQVNIX0JBU0UgSDRfQ1MxX0JBU0UKKyNkZWZpbmUgREVCVUdfQkFTRQkweDA4MDAwMDAwCisKKy8qIGJhc2UgYWRkcmVzcyBmb3IgaW5kaXJlY3QgdmVjdG9ycyAoaW50ZXJuYWwgYm9vdCBtb2RlKSAqLworI2RlZmluZSBTUkFNX09GRlNFVDAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDEgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDIgICAgICAgICAgMHgwMDAwRjgwMAorI2RlZmluZSBTUkFNX1ZFQ1RfQ09ERSAgICAgICAoU1JBTV9PRkZTRVQwfFNSQU1fT0ZGU0VUMXxTUkFNX09GRlNFVDIpCisKKyNkZWZpbmUgTE9XX0xFVkVMX1NSQU1fU1RBQ0sgIDB4NDAyMEZGRkMKKworI2RlZmluZSBQRVJJRkVSQUxfUE9SVF9CQVNFICAgMHg0ODBGRTAwMworCisjZW5kaWYgIC8qIGVuZGlmIENPTkZJR18yNDMwU0RQICovCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc2l6ZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtMTEzNi9zaXplcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc2l6ZXMuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcJIFVTQQorICovCisvKiAgU2l6ZSBkZWZpbnRpb25zCisgKiAgQ29weXJpZ2h0IChDKSBBUk0gTGltaXRlZCAxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX19zaXplc19oCisjZGVmaW5lIF9fc2l6ZXNfaAkJCTEKKworLyogaGFuZHkgc2l6ZXMgKi8KKyNkZWZpbmUgU1pfMUsJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBTWl80SwkJCQkweDAwMDAxMDAwCisjZGVmaW5lIFNaXzhLCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgU1pfMTZLCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgU1pfMzJLCQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgU1pfNjRLCQkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgU1pfMTI4SwkJCQkweDAwMDIwMDAwCisjZGVmaW5lIFNaXzI1NksJCQkJMHgwMDA0MDAwMAorI2RlZmluZSBTWl81MTJLCQkJCTB4MDAwODAwMDAKKworI2RlZmluZSBTWl8xTQkJCQkweDAwMTAwMDAwCisjZGVmaW5lIFNaXzJNCQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1pfNE0JCQkJMHgwMDQwMDAwMAorI2RlZmluZSBTWl84TQkJCQkweDAwODAwMDAwCisjZGVmaW5lIFNaXzE2TQkJCQkweDAxMDAwMDAwCisjZGVmaW5lIFNaXzMxTQkJCQkweDAxRjAwMDAwCisjZGVmaW5lIFNaXzMyTQkJCQkweDAyMDAwMDAwCisjZGVmaW5lIFNaXzY0TQkJCQkweDA0MDAwMDAwCisjZGVmaW5lIFNaXzEyOE0JCQkJMHgwODAwMDAwMAorI2RlZmluZSBTWl8yNTZNCQkJCTB4MTAwMDAwMDAKKyNkZWZpbmUgU1pfNTEyTQkJCQkweDIwMDAwMDAwCisKKyNkZWZpbmUgU1pfMUcJCQkJMHg0MDAwMDAwMAorI2RlZmluZSBTWl8yRwkJCQkweDgwMDAwMDAwCisKKyNlbmRpZgkvKiBfX3NpemVzX2ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3N5c19pbmZvLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLWFybTExMzYvc3lzX2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGEwOWNkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm0xMTM2L3N5c19pbmZvLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNSAoQykgVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDI0WFhfU1lTX0lORk9fSF8KKyNkZWZpbmUgX09NQVAyNFhYX1NZU19JTkZPX0hfCisKKyNpZiAwCit0eXBlZGVmIHN0cnVjdCAgaDRfc3lzdGVtX2RhdGEgeworCS8qIGJhc2UgYm9hcmQgaW5mbyAqLworCXUzMiBiYXNlX2JfcmV2OwkJLyogcmV2IGZyb20gYmFzZSBib2FyZCBpMmMgKi8KKwkvKiBjcHUgYm9hcmQgaW5mbyAqLworCXUzMiBjcHVfYl9yZXY7CQkvKiByZXYgZnJvbSBjcHUgYm9hcmQgaTJjICovCisJdTMyIGNwdV9iX211eDsJCS8qIG11eCB0eXBlIG9uIGRhdWdodGVyIGJvYXJkICovCisJdTMyIGNwdV9iX2Rkcl90eXBlOwkvKiBtZW0gdHlwZSAqLworCXUzMiBjcHVfYl9kZHJfc3BlZWQ7CS8qIGRkciBzcGVlZCByYXRpbmcgKi8KKwl1MzIgY3B1X2Jfc3dpdGNoZXM7CS8qIGJvb3QgY3RybCBzd2l0Y2ggc2V0dGluZ3MgKi8KKwkvKiBjcHUgaW5mbyAqLworCXUzMiBjcHVfdHlwZTsJCS8qIHR5cGUgb2YgY3B1OyAyNDIwLCAyNDIyLCAyNDMwLC4uLiovCisJdTMyIGNwdV9yZXY7CQkvKiByZXYgb2YgZ2l2ZW4gY3B1OyBFUzEsIEVTMiwuLi4qLworfSBoNF9zeXNfZGF0YTsKKworI2VuZGlmCisKKyNkZWZpbmUgWERSX1BPUCAgICAgICAgICAgNSAgICAgIC8qIHBhY2thZ2Ugb24gcGFja2FnZSBwYXJ0ICovCisjZGVmaW5lIFNEUl9ESVNDUkVURSAgICAgIDQgICAgICAvKiAxMjhNIG1lbW9yeSBTRFIgbW9kdWxlKi8KKyNkZWZpbmUgRERSX1NUQUNLRUQgICAgICAgMyAgICAgIC8qIHN0YWNrZWQgcGFydCBvbiAyNDIyICovCisjZGVmaW5lIEREUl9DT01CTyAgICAgICAgIDIgICAgICAvKiBjb21ibyBwYXJ0IG9uIGNwdSBkYXVnaHRlciBjYXJkIChtZW5hbGFldXMpICovCisjZGVmaW5lIEREUl9ESVNDUkVURSAgICAgIDEgICAgICAvKiAyeDE2IHBhcnRzIG9uIGRhdWdodGVyIGNhcmQgKi8KKworI2RlZmluZSBERFJfMTAwICAgICAgICAgICAxMDAgICAgLyogdHlwZSBmb3VuZCBvbiBtb3N0IG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTExICAgICAgICAgICAxMTEgICAgLyogc29tZSBjb21ibyBwYXJ0cyAqLworI2RlZmluZSBERFJfMTMzICAgICAgICAgICAxMzMgICAgLyogbW9zdCBjb21ibywgc29tZSBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzE2NSAgICAgICAgICAgMTY1ICAgIC8qIGZ1dHVyZSBwYXJ0cyAqLworCisjZGVmaW5lIENQVV8yNDIwICAgICAgICAgIDB4MjQyMAorI2RlZmluZSBDUFVfMjQyMiAgICAgICAgICAweDI0MjIgLyogMjQyMCArIDY0TSBzdGFja2VkICovCisjZGVmaW5lIENQVV8yNDIzICAgICAgICAgIDB4MjQyMyAvKiAyNDIwICsgOTZNIHN0YWNrZWQgKi8KKyNkZWZpbmUgQ1BVXzI0MzAgICAgICAgICAgMHgyNDMwCisKKy8qIDI0MnggcmVhbCBoYXJkd2FyZToKKyAqICBFUzEgICAgID0gcmV2IDAKKyAqICBFUzIgICAgID0gcmV2IDEKKyAqICBFUzIuMDUgID0gcmV2IDIKKyAqICBFUzIuMSAgID0gcmV2IDMKKyAqICBFUzIuMS4xID0gcmV2IDQKKyAqLworCisvKiAyNDJ4IGNvZGUgZGVmaW5lczoKKyAqIEVTMSAgICAgPSAwKzEgPSAxCisgKiBFUzIgICAgID0gMSsxID0gMgorICogRVMyLjA1ICA9IDIrMSA9IDMKKyAqIEVTMi4xICAgPSAzKzEgPSA0CisgKiBFczIuMS4xID0gNCsxID0gNQorICovCisjZGVmaW5lIENQVV8yNDIyX0VTMSAgICAgIDEKKyNkZWZpbmUgQ1BVXzI0MjJfRVMyICAgICAgMgorI2RlZmluZSBDUFVfMjQyMl9FUzJfMDUgICAzCisjZGVmaW5lIENQVV8yNDIyX0VTMl8xICAgIDQKKyNkZWZpbmUgQ1BVXzI0MjJfRVMyXzFfMSAgNQorCisjZGVmaW5lIENQVV8yNDIwX0VTMSAgICAgIDEKKyNkZWZpbmUgQ1BVXzI0MjBfRVMyICAgICAgMgorI2RlZmluZSBDUFVfMjQyMF9FUzJfMDUgICAzCisjZGVmaW5lIENQVV8yNDIwX0VTMl8xICAgIDQKKyNkZWZpbmUgQ1BVXzI0MjBfRVMyXzFfMSAgNQorCisjZGVmaW5lIENQVV8yNDJYX0VTMSAgICAgIDEKKyNkZWZpbmUgQ1BVXzI0MlhfRVMyICAgICAgMgorI2RlZmluZSBDUFVfMjQyWF9FUzJfMDUgICAzCisjZGVmaW5lIENQVV8yNDJYX0VTMl8xICAgIDQKKyNkZWZpbmUgQ1BVXzI0MlhfRVMyXzFfMSAgNQorCisjZGVmaW5lIENQVV8yNDIwXzI0MjJfRVMxIDEKKyNkZWZpbmUgQ1BVXzI0MjBfMjQyMl9FUzJfMSA0CisKKy8qIDI0M3ggcmVhbCBoYXJkd2FyZToKKyAqICBFUzEgICAgID0gcmV2IDAKKyAqICBFUzIgICAgID0gcmV2IDEKKyAqCisgKiAyNDN4IGNvZGUgZGVmaW5lczoKKyAqIEVTMSAgICAgPSAwKzEgPSAxCisgKiBFUzIgICAgID0gMSsxID0gMgorICovCisjZGVmaW5lIENQVV8yNDMwX0VTMSAgICAgMQorI2RlZmluZSBDUFVfMjQzMF9FUzIgICAgIDIKKworI2lmZGVmIFZQT00yNDMwCisjIGRlZmluZSBDUFVfMjQzMF9WSVJUSU8gICAzCisjZWxzZQorIyBkZWZpbmUgQ1BVXzI0MzBfVklSVElPICAgMQorI2VuZGlmCisjZGVmaW5lIENQVV8yNDMwX1pFQlUgICAgIDB4RAorCisjZGVmaW5lIENQVV8yNDIwX0NISVBJRCAgIDB4MEI1RDkwMDAKKyNkZWZpbmUgQ1BVXzI0MzBfQ0hJUElEICAgMHgwQjY4QTAwMAorI2RlZmluZSBDUFVfMjRYWF9JRF9NQVNLICAweDBGRkZGMDAwCisjZGVmaW5lIENQVV8yNDJYX1JFVl9NQVNLIDB4RjAwMDAwMDAKKyNkZWZpbmUgQ1BVXzI0MlhfUElEX01BU0sgMHgwMDBGMDAwMAorCisjZGVmaW5lIEJPQVJEX0g0X01FTkVMQVVTICAgICAxCisjZGVmaW5lIEJPQVJEX0g0X1NEUCAgICAgICAgICAyCisjZGVmaW5lIEJPQVJEX0g0X01FTkVMQVVTX0hSUCAzCisjZGVmaW5lIEJPQVJEX1NEUF8yNDMwICAgICAgICA0CisKKyNkZWZpbmUgR1BNQ19NVVhFRCAgICAgICAgMQorI2RlZmluZSBHUE1DX05PTk1VWEVEICAgICAwCisKKyNkZWZpbmUgVFlQRV9OQU5EICAgICAgICAgMHg4MDAgICAvKiBiaXQgcG9zIGZvciBuYW5kIGluIGdwbWMgcmVnICovCisjZGVmaW5lIFRZUEVfTk9SICAgICAgICAgIDB4MDAwCisjZGVmaW5lIFRZUEVfT05FTkFORCAgICAgIDB4ODAwCisKKyNkZWZpbmUgV0lEVEhfOEJJVCAgICAgICAgMHgwMDAwCisjZGVmaW5lIFdJRFRIXzE2QklUICAgICAgIDB4MTAwMCAgLyogYml0IHBvcyBmb3IgMTYgYml0IGluIGdwbWMgKi8KKworI2RlZmluZSBJMkNfTUVORUxBVVMgMHg3MgkvKiBpMmMgaWQgZm9yIGNvbXBhbmlvbiBjaGlwICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1hcm05MjZlanMvc2l6ZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzL3NpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwYjk5YgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtYXJtOTI2ZWpzL3NpemVzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BMCAyMTExLTEzMDcKKyAqIFVTQQorICovCisvKiBETyBOT1QgRURJVCEhIC0gdGhpcyBmaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgKgkJICAgZnJvbSAucyBmaWxlIGJ5IGF3ayAtZiBzMmguYXdrCisgKi8KKy8qICBTaXplIGRlZmludGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIEFSTSBMaW1pdGVkIDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX3NpemVzX2gKKyNkZWZpbmUgX19zaXplc19oCQkJMQorCisvKiBoYW5keSBzaXplcyAqLworI2RlZmluZSBTWl8xSwkJMHgwMDAwMDQwMAorI2RlZmluZSBTWl80SwkJMHgwMDAwMTAwMAorI2RlZmluZSBTWl84SwkJMHgwMDAwMjAwMAorI2RlZmluZSBTWl8xNksJCTB4MDAwMDQwMDAKKyNkZWZpbmUgU1pfNjRLCQkweDAwMDEwMDAwCisjZGVmaW5lIFNaXzEyOEsJMHgwMDAyMDAwMAorI2RlZmluZSBTWl8yNTZLCTB4MDAwNDAwMDAKKyNkZWZpbmUgU1pfNTEySwkweDAwMDgwMDAwCisKKyNkZWZpbmUgU1pfMU0JCTB4MDAxMDAwMDAKKyNkZWZpbmUgU1pfMk0JCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1pfNE0JCTB4MDA0MDAwMDAKKyNkZWZpbmUgU1pfOE0JCTB4MDA4MDAwMDAKKyNkZWZpbmUgU1pfMTZNCQkweDAxMDAwMDAwCisjZGVmaW5lIFNaXzMyTQkJMHgwMjAwMDAwMAorI2RlZmluZSBTWl82NE0JCTB4MDQwMDAwMDAKKyNkZWZpbmUgU1pfMTI4TQkweDA4MDAwMDAwCisjZGVmaW5lIFNaXzI1Nk0JMHgxMDAwMDAwMAorI2RlZmluZSBTWl81MTJNCTB4MjAwMDAwMDAKKworI2RlZmluZSBTWl8xRwkJMHg0MDAwMDAwMAorI2RlZmluZSBTWl8yRwkJMHg4MDAwMDAwMAorCisjZW5kaWYJLyogX19zaXplc19oICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2JpdHMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDY4YmUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2JpdHMuaApAQCAtMCwwICsxLDU3IEBACisvKiBiaXRzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTmVzdCBMYWJzLCBJbmMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgZm91bmQgaW4gdGhlIGZpbGUKKyAqIG5hbWVkIENPUFlJTkcgdGhhdCBzaG91bGQgaGF2ZSBhY2NvbXBhbmllZCB0aGlzIGZpbGUuCisgKgorICogVEhJUyBQQUNLQUdFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBfX2JpdHNfaAorI2RlZmluZSBfX2JpdHNfaCAxCisKKyNkZWZpbmUgQVJNX1JFR19NQVNLKGJpdHMpCQkJCQkJKCgxIDw8IChiaXRzKSkgLSAxKQorI2RlZmluZSBBUk1fUkVHX1ZBTChiaXQsIG1hc2spCQkJCQkoKG1hc2spIDw8IChiaXQpKQorI2RlZmluZSBBUk1fUkVHX1ZBTF9FTkNPREUoc2hpZnQsIG1hc2ssIHZhbHVlKQkoKCh2YWx1ZSkgPDwgKHNoaWZ0KSkgJiAobWFzaykpCisjZGVmaW5lIEFSTV9SRUdfVkFMX0RFQ09ERShzaGlmdCwgbWFzaywgdmFsdWUpCSgoKHZhbHVlKSAmIChtYXNrKSkgPj4gKHNoaWZ0KSkKKworCisjZGVmaW5lIEJJVDAgIEFSTV9SRUdfVkFMKCAwLCAxKQorI2RlZmluZSBCSVQxICBBUk1fUkVHX1ZBTCggMSwgMSkKKyNkZWZpbmUgQklUMiAgQVJNX1JFR19WQUwoIDIsIDEpCisjZGVmaW5lIEJJVDMgIEFSTV9SRUdfVkFMKCAzLCAxKQorI2RlZmluZSBCSVQ0ICBBUk1fUkVHX1ZBTCggNCwgMSkKKyNkZWZpbmUgQklUNSAgQVJNX1JFR19WQUwoIDUsIDEpCisjZGVmaW5lIEJJVDYgIEFSTV9SRUdfVkFMKCA2LCAxKQorI2RlZmluZSBCSVQ3ICBBUk1fUkVHX1ZBTCggNywgMSkKKyNkZWZpbmUgQklUOCAgQVJNX1JFR19WQUwoIDgsIDEpCisjZGVmaW5lIEJJVDkgIEFSTV9SRUdfVkFMKCA5LCAxKQorI2RlZmluZSBCSVQxMCBBUk1fUkVHX1ZBTCgxMCwgMSkKKyNkZWZpbmUgQklUMTEgQVJNX1JFR19WQUwoMTEsIDEpCisjZGVmaW5lIEJJVDEyIEFSTV9SRUdfVkFMKDEyLCAxKQorI2RlZmluZSBCSVQxMyBBUk1fUkVHX1ZBTCgxMywgMSkKKyNkZWZpbmUgQklUMTQgQVJNX1JFR19WQUwoMTQsIDEpCisjZGVmaW5lIEJJVDE1IEFSTV9SRUdfVkFMKDE1LCAxKQorI2RlZmluZSBCSVQxNiBBUk1fUkVHX1ZBTCgxNiwgMSkKKyNkZWZpbmUgQklUMTcgQVJNX1JFR19WQUwoMTcsIDEpCisjZGVmaW5lIEJJVDE4IEFSTV9SRUdfVkFMKDE4LCAxKQorI2RlZmluZSBCSVQxOSBBUk1fUkVHX1ZBTCgxOSwgMSkKKyNkZWZpbmUgQklUMjAgQVJNX1JFR19WQUwoMjAsIDEpCisjZGVmaW5lIEJJVDIxIEFSTV9SRUdfVkFMKDIxLCAxKQorI2RlZmluZSBCSVQyMiBBUk1fUkVHX1ZBTCgyMiwgMSkKKyNkZWZpbmUgQklUMjMgQVJNX1JFR19WQUwoMjMsIDEpCisjZGVmaW5lIEJJVDI0IEFSTV9SRUdfVkFMKDI0LCAxKQorI2RlZmluZSBCSVQyNSBBUk1fUkVHX1ZBTCgyNSwgMSkKKyNkZWZpbmUgQklUMjYgQVJNX1JFR19WQUwoMjYsIDEpCisjZGVmaW5lIEJJVDI3IEFSTV9SRUdfVkFMKDI3LCAxKQorI2RlZmluZSBCSVQyOCBBUk1fUkVHX1ZBTCgyOCwgMSkKKyNkZWZpbmUgQklUMjkgQVJNX1JFR19WQUwoMjksIDEpCisjZGVmaW5lIEJJVDMwIEFSTV9SRUdfVkFMKDMwLCAxKQorI2RlZmluZSBCSVQzMSBBUk1fUkVHX1ZBTCgzMSwgMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2Nrcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQyMWQzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIC9QVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICAqLworI2lmbmRlZiBfT01BUDM0WFhfQ0xPQ0tTX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9DTE9DS1NfSF8KKworI2RlZmluZSBMREVMQVkgICAgICAxMjAwMDAwMAorCisjZGVmaW5lIFMxMk0JCTEyMDAwMDAwCisjZGVmaW5lIFMxM00JCTEzMDAwMDAwCisjZGVmaW5lIFMxNl84TQkJMTY4MDAwMDAKKyNkZWZpbmUgUzE5XzJNCQkxOTIwMDAwMAorI2RlZmluZSBTMjRNCQkyNDAwMDAwMAorI2RlZmluZSBTMjZNCQkyNjAwMDAwMAorI2RlZmluZSBTMzhfNE0JCTM4NDAwMDAwCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jbG9ja3MzNDN4Lmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MzNDN4LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2Nsb2NrczM0M3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzNlZGQxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9jbG9ja3MzNDN4LmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMzQzWF9DTE9DS1NfSF8KKyNkZWZpbmUgX09NQVAzNDNYX0NMT0NLU19IXworCisjZGVmaW5lIFBMTF9TVE9QICAgICAgICAxICAgICAgICAgLyogUEVSICYgSVZBICovCisjZGVmaW5lIFBMTF9MT1dfUE9XRVJfQllQQVNTICAgNSAgLyogTVBVLCBJVkEgJiBDT1JFICovCisjZGVmaW5lIFBMTF9GQVNUX1JFTE9DS19CWVBBU1MgNiAgLyogQ09SRSAqLworI2RlZmluZSBQTExfTE9DSyAgICAgICAgNyAgICAgICAgIC8qIE1QVSwgSVZBLCBDT1JFICYgUEVSICovCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgYXJlIE9QUCBhbmQgU3lzQ2xrIHZhbHVlIGluZGVwZW5kYW50CisgKiBhbmQgaGVuY2UgYXJlIGRlZmluZWQgaGVyZS4gQWxsIHRoZSBvdGhlciBEUExMIHJlbGF0ZWQgdmFsdWVzIGFyZQorICogdGFidWxhdGVkIGluIGxvd2xldmVsX2luaXQuUy4KKyAqLworCisvKiBDT1JFIERQTEwgKi8KKyMgIGRlZmluZSBDT1JFX00zWDIgICAgICAyICAgICAgICAvKiAzMzJNSHogOiBDTV9DTEtTRUwxX0VNVSAqLworIyAgZGVmaW5lIENPUkVfU1NJX0RJViAgIDMgICAgICAgIC8qIDIyMU1IeiA6IENNX0NMS1NFTF9DT1JFICovCisjICBkZWZpbmUgQ09SRV9GVVNCX0RJViAgMiAgICAgICAgLyogNDEuNU1IejogKi8KKyMgIGRlZmluZSBDT1JFX0w0X0RJViAgICAyICAgICAgICAvKiAgODNNSHogOiBMNCAqLworIyAgZGVmaW5lIENPUkVfTDNfRElWICAgIDIgICAgICAgIC8qIDE2Nk1IeiA6IEwzIHtERFJ9ICovCisjICBkZWZpbmUgR0ZYX0RJVl8zNFggICAgMyAgICAgICAgLyogIDk2TUh6IDogQ01fQ0xLU0VMX0dGWCAqLworIyAgZGVmaW5lIEdGWF9ESVZfMzZYICAgIDUgICAgICAgIC8qICAyMDBNSHogOiBDTV9DTEtTRUxfR0ZYICovCisvKiBLZWVwIGRlZmF1bHQgdG8gOTZNaHogKi8KKyMgIGRlZmluZSBHRlhfRElWICAgICAgICAzICAgICAgICAvKiAgOTZNSHogOiBDTV9DTEtTRUxfR0ZYICovCisjICBkZWZpbmUgV0tVUF9SU00gICAgICAgMiAgICAgICAgLyogNDEuNU1IejogQ01fQ0xLU0VMX1dLVVAgKi8KKworLyogUEVSIERQTEwgKi8KKyMgZGVmaW5lIFBFUl9NNlgyICAgICAgIDMgICAgICAgICAvKiAyODhNSHo6IENNX0NMS1NFTDFfRU1VICovCisjIGRlZmluZSBQRVJfTTVYMiAgICAgICA0ICAgICAgICAgLyogMjE2TUh6OiBDTV9DTEtTRUxfQ0FNICovCisjIGRlZmluZSBQRVJfTTRYMiAgICAgICA5ICAgICAgICAgLyogOTZNSHogOiBDTV9DTEtTRUxfRFNTLWRzczEgKi8KKyMgZGVmaW5lIFBFUl9NM1gyICAgICAgIDE2ICAgICAgICAvKiA1NE1IeiA6IENNX0NMS1NFTF9EU1MtdHYgKi8KKworIyAgZGVmaW5lIENMU0VMMV9FTVVfVkFMICgoQ09SRV9NM1gyIDw8IDE2KSB8IChQRVJfTTZYMiA8PCAyNCkgfCAoMHgwYTUwKSkKKworI2lmZGVmIFBSQ01fQ0xLX0NGRzJfMzMyTUhaCisjIGRlZmluZSBNXzEyCQkweEE2CisjIGRlZmluZSBOXzEyCQkweDA1CisjIGRlZmluZSBGU0VMXzEyCTB4MDcKKyMgZGVmaW5lIE0yXzEyCQkweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xMl9FUzEJMHgwRQorIyBkZWZpbmUgRlNMXzEyX0VTMSAweDAzCisjIGRlZmluZSBNMl8xMl9FUzEgIDB4MSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTMgICAgICAgMHgxNEMKKyMgZGVmaW5lIE5fMTMgICAgICAgMHgwQworIyBkZWZpbmUgRlNFTF8xMwkweDAzCisjIGRlZmluZSBNMl8xMwkJMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTNfRVMxCTB4MUIyCisjIGRlZmluZSBOXzEzX0VTMQkweDEwCisjIGRlZmluZSBGU0xfMTNfRVMxIDB4MDMKKyMgZGVmaW5lIE0yXzEzX0VTMQkweDAxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xOXAyICAgICAweDE5RgorIyBkZWZpbmUgTl8xOXAyICAgICAweDE3CisjIGRlZmluZSBGU0VMXzE5cDIgIDB4MDMKKyMgZGVmaW5lIE0yXzE5cDIgICAgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTlwMl9FUzEJMHgxOUYKKyMgZGVmaW5lIE5fMTlwMl9FUzEJMHgxNworIyBkZWZpbmUgRlNMXzE5cDJfRVMxIDB4MDMKKyMgZGVmaW5lIE0yXzE5cDJfRVMxIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzI2ICAgICAgIDB4QTYKKyMgZGVmaW5lIE5fMjYgICAgICAgMHgwQworIyBkZWZpbmUgRlNFTF8yNiAgICAweDA3CisjIGRlZmluZSBNMl8yNiAgICAgIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzI2X0VTMQkweDFCMgorIyBkZWZpbmUgTl8yNl9FUzEJMHgyMQorIyBkZWZpbmUgRlNMXzI2X0VTMQkweDAzCisjIGRlZmluZSBNMl8yNl9FUzEJMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMzhwNCAgICAgMHgxOUYKKyMgZGVmaW5lIE5fMzhwNCAgICAgMHgyRgorIyBkZWZpbmUgRlNFTF8zOHA0ICAweDAzCisjIGRlZmluZSBNMl8zOHA0ICAgIDB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzM4cDRfRVMxCTB4MTlGCisjIGRlZmluZSBOXzM4cDRfRVMxCTB4MkYKKyMgZGVmaW5lIEZTTF8zOHA0X0VTMSAweDAzCisjIGRlZmluZSBNMl8zOHA0X0VTMSAweDAxIC8qIE0zIG9mIDIgKi8KKworI2VsaWYgZGVmaW5lZChQUkNNX0NMS19DRkcyXzI2Nk1IWikKKyMgZGVmaW5lIE1fMTIJCTB4ODUKKyMgZGVmaW5lIE5fMTIgICAgICAgMHgwNQorIyBkZWZpbmUgRlNFTF8xMiAgICAweDA3CisjIGRlZmluZSBNMl8xMiAgICAgIDB4MDIgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzEyX0VTMQkweDg1ICAvKiAweDEwQSAqLworIyBkZWZpbmUgTl8xMl9FUzEJMHgwNSAgLyogMHgwNSAqLworIyBkZWZpbmUgRlNMXzEyX0VTMSAweDA3ICAvKiAweDcgKi8KKyMgZGVmaW5lIE0yXzEyX0VTMSAgMHgyICAgLyogMHgyIHdpdGggYW4gTTMgb2YgNCovCisKKyMgZGVmaW5lIE1fMTMgICAgICAgMHgxMEEKKyMgZGVmaW5lIE5fMTMgICAgICAgMHgwQworIyBkZWZpbmUgRlNFTF8xMyAgICAweDMKKyMgZGVmaW5lIE0yXzEzICAgICAgMHgxIC8qIE0zIG9mIDIgKi8KKworIyBkZWZpbmUgTV8xM19FUzEJMHgxMEEgLyogMHgyMTQgKi8KKyMgZGVmaW5lIE5fMTNfRVMxCTB4MEMgIC8qIDB4QyAqLworIyBkZWZpbmUgRlNMXzEzX0VTMSAweDMgICAvKiAweDMgKi8KKyMgZGVmaW5lIE0yXzEzX0VTMQkweDEgICAvKiAweDIgd2l0aCBhbiBNMyBvZiA0Ki8KKworIyBkZWZpbmUgTV8xOXAyICAgICAweDExNQorIyBkZWZpbmUgTl8xOXAyICAgICAweDEzCisjIGRlZmluZSBGU0VMXzE5cDIgIDB4MDMKKyMgZGVmaW5lIE0yXzE5cDIgICAgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMTlwMl9FUzEJMHgxMTUgIC8qIDB4Mjk5ICovCisjIGRlZmluZSBOXzE5cDJfRVMxCTB4MTMgICAvKiAweDE3ICovCisjIGRlZmluZSBGU0xfMTlwMl9FUzEgMHgwMyAvKiAweDAzICovCisjIGRlZmluZSBNMl8xOXAyX0VTMSAweDAxICAvKiAweDIgd2l0aCBNMyBvZiA0ICovCisKKyMgZGVmaW5lIE1fMjYJCTB4ODUKKyMgZGVmaW5lIE5fMjYJCTB4MEMKKyMgZGVmaW5lIEZTRUxfMjYJMHgwNworIyBkZWZpbmUgTTJfMjYJCTB4MDEgLyogTTMgb2YgMiAqLworCisjIGRlZmluZSBNXzI2X0VTMQkweDg1ICAvKiAweDEwQSAqLworIyBkZWZpbmUgTl8yNl9FUzEJMHgwQyAgLyogMHhDICovCisjIGRlZmluZSBGU0xfMjZfRVMxIDB4MDcgIC8qIDB4NyAqLworIyBkZWZpbmUgTTJfMjZfRVMxCTB4MDEgIC8qIDB4MiB3aXRoIGFuIE0zIG9mIDQgKi8KKworIyBkZWZpbmUgTV8zOHA0ICAgICAweDExQworIyBkZWZpbmUgTl8zOHA0ICAgICAweDI4CisjIGRlZmluZSBGU0VMXzM4cDQgIDB4MDMKKyMgZGVmaW5lIE0yXzM4cDQgICAgMHgwMSAvKiBNMyBvZiAyICovCisKKyMgZGVmaW5lIE1fMzhwNF9FUzEJMHgxMUMgIC8qIDB4Mjk5ICovCisjIGRlZmluZSBOXzM4cDRfRVMxCTB4MjggICAvKiAweDJmICovCisjIGRlZmluZSBGU0xfMzhwNF9FUzEgMHgwMyAvKiAweDMgKi8KKyMgZGVmaW5lIE0yXzM4cDRfRVMxIDB4MDEgIC8qIDB4MiB3aXRoIGFuIE0zIG9mIDQqLworCisJIyBlbmRpZgorCisjZW5kaWYgIC8qIGVuZGlmIF9PTUFQMzQzWF9DTE9DS1NfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvY3B1LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTc4MzEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2NwdS5oCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX09NQVAzNFhYX0NQVV9ICisjZGVmaW5lICBfT01BUDM0WFhfQ1BVX0gKKyNpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAzLmg+CisjZWxpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0MzApCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDM0MzAuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3BtYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3ByY20uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9zZHJjLmg+CisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgb2YgY29tbW9uIG1vZHVsZXMgKi8KKy8qIENvbnRyb2wgKi8KKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVMJCShPTUFQMzRYWF9DVFJMX0JBU0UgKyAweDJGMCkKKyNkZWZpbmUgT01BUDM0WFhfTUNSCQkoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg4QykKKyNkZWZpbmUgQ09OVFJPTF9TQ0FMQUJMRV9PTUFQX1NUQVRVUwkoT01BUDM0WFhfQ1RSTF9CQVNFICsgMHg0NEMpCisjZGVmaW5lIENPTlRST0xfU0NBTEFCTEVfT01BUF9PQ1AJKE9NQVAzNFhYX0NUUkxfQkFTRSArIDB4NTM0KQorCisKKy8qIFRhcCBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBUQVBfSURDT0RFX1JFRwkJKE9NQVAzNFhYX1RBUF9CQVNFKzB4MjA0KQorI2RlZmluZSBQUk9EVUNUSU9OX0lECQkoT01BUDM0WFhfVEFQX0JBU0UrMHgyMDgpCisKKy8qIE9NQVAgMzRYWC8zNVhYLzM2eHgvMzd4eCBDb250cm9sIElEICovCisjZGVmaW5lIE9NQVAzNFhYX0NPTlRST0xfSUQJCShPTUFQMzRYWF9XQUtFVVBfTDRfSU9fQkFTRSArIDB4YTIwNCkKKworI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX01BU0sJCQlBUk1fUkVHX1ZBTCg4LCAweDcpCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfRU5DT0RFKHYpCQkoKCh2KSA8PCA4KSAmIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfTUFTSykKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9ERUNPREUodikJCSgoKHYpICYgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9NQVNLKSA+PiA4KQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX1RTVAkJCQkweDAKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfREVWSUNFVFlQRV9FTVUJCQkJMHgxCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfSFMJCQkJMHgyCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1AJCQkJMHgzCisKKy8qCisgKiBMZWdhY3kgbW5lbW9uaWNzCisgKi8KKyNkZWZpbmUgREVWSUNFX01BU0sJCQkJCQkJCQlDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX01BU0sKKyNkZWZpbmUgVFNUX0RFVklDRQkJCQkJCQkJCUNPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfVFNUCisjZGVmaW5lIEVNVV9ERVZJQ0UJCQkJCQkJCQlDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0VNVQorI2RlZmluZSBIU19ERVZJQ0UJCQkJCQkJCQlDT05UUk9MX1NUQVRVU19ERVZJQ0VUWVBFX0hTCisjZGVmaW5lIEdQX0RFVklDRQkJCQkJCQkJCUNPTlRST0xfU1RBVFVTX0RFVklDRVRZUEVfR1AKKworI2RlZmluZQlDT05UUk9MX1NUQVRVU19TWVNCT09UX01BU0sJCQkJQVJNX1JFR19WQUwoMCwgMHgzRikKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9FTkNPREUodikJCSgoKHYpIDw8IDApICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9NQVNLKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX0RFQ09ERSh2KQkJKCgodikgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX01BU0spID4+IDApCisKKyNkZWZpbmUJQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX01BU0sJCUFSTV9SRUdfVkFMKDUsIDB4MSkKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX0VOQ09ERSh2KQkoKCh2KSA8PCAwKSAmIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9NQVNLKQorI2RlZmluZSBDT05UUk9MX1NUQVRVU19TWVNCT09UX1RZUEVfREVDT0RFKHYpCSgoKHYpICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX01BU0spID4+IDApCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfVFlQRV9NRU1PUlkJCQkweDAKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9UWVBFX1BFUklQSEVSQUwJCTB4MQorCisjZGVmaW5lCUNPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfTUFTSwkJQVJNX1JFR19WQUwoMCwgMHgxRikKKyNkZWZpbmUgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9FTkNPREUodikJKCgodikgPDwgMCkgJiBDT05UUk9MX1NUQVRVU19TWVNCT09UX09SREVSX01BU0spCisjZGVmaW5lIENPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfREVDT0RFKHYpCSgoKHYpICYgQ09OVFJPTF9TVEFUVVNfU1lTQk9PVF9PUkRFUl9NQVNLKSA+PiAwKQorCisvKgorICogTGVnYWN5IG1uZW9tbmljCisgKgorICogV2UgYXJlIG5vdCBjb25jZXJuZWQgd2l0aCBCSVQ1IGFzIGl0IG9ubHkgZGV0ZXJtaW5lcyB0aGUgcHJpcm90aXkKKyAqIGJldHdlZW4gbWVtb3J5IG9yIHBlcnBoZXJhbCBib290aW5nCisgKi8KKyNkZWZpbmUgU1lTQk9PVF9NQVNLCQkJCQkJCUNPTlRST0xfU1RBVFVTX1NZU0JPT1RfT1JERVJfTUFTSworCisvKiBHUE1DIENTMy9jczQvY3M2IG5vdCBhdmFsaWFibGUgKi8KKworI2RlZmluZSBHUE1DX0JBU0UJCQkJCQkoT01BUDM0WFhfR1BNQ19CQVNFKQorCisjZGVmaW5lIEdQTUNfUkVWSVNJT04JCQkJCShHUE1DX0JBU0UgKyAweDAwMDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHIAkJCQkJKEdQTUNfQkFTRSArIDB4MDAxMCkKKyNkZWZpbmUgR1BNQ19TWVNTVEFUVVMgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDE0KQorI2RlZmluZSBHUE1DX0lSUVNUQVRVUyAJCQkJCShHUE1DX0JBU0UgKyAweDAwMTgpCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFIAkJCQkJKEdQTUNfQkFTRSArIDB4MDAxQykKKyNkZWZpbmUgR1BNQ19USU1FT1VUX0NPTlRST0wgCQkJKEdQTUNfQkFTRSArIDB4MDA0MCkKKyNkZWZpbmUgR1BNQ19FUlJfQUREUkVTUwkJCQkoR1BNQ19CQVNFICsgMHgwMDQ0KQorI2RlZmluZSBHUE1DX0VSUl9UWVBFIAkJCQkJKEdQTUNfQkFTRSArIDB4MDA0OCkKKyNkZWZpbmUgR1BNQ19DT05GSUcgCQkJCQkoR1BNQ19CQVNFICsgMHgwMDUwKQorI2RlZmluZSBHUE1DX1NUQVRVUyAJCQkJCShHUE1DX0JBU0UgKyAweDAwNTQpCisKKyNkZWZpbmUgR1BNQ19DT05GSUdfQkFTRQkJCQkoR1BNQ19CQVNFICsgMHgwMDYwKQorI2RlZmluZSBHUE1DX0NPTkZJR19TSVpFCQkJCTB4MDAzMAorI2RlZmluZSBHUE1DX0NPTkZJR1hfQkFTRShyZWcpCQkJKEdQTUNfQ09ORklHX0JBU0UgKyAoKChyZWcpIC0gMSkgKiA0KSkKKyNkZWZpbmUgR1BNQ19DT05GSUdYKHJlZywgY3MpCQkJKEdQTUNfQ09ORklHWF9CQVNFKHJlZykgKyAoKGNzKSAqIEdQTUNfQ09ORklHX1NJWkUpKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMShjcykJCQkJR1BNQ19DT05GSUdYKDEsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzIoY3MpCQkJCUdQTUNfQ09ORklHWCgyLCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUczKGNzKQkJCQlHUE1DX0NPTkZJR1goMywgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHNChjcykJCQkJR1BNQ19DT05GSUdYKDQsIGNzKQorI2RlZmluZSBHUE1DX0NPTkZJRzUoY3MpCQkJCUdQTUNfQ09ORklHWCg1LCBjcykKKyNkZWZpbmUgR1BNQ19DT05GSUc2KGNzKQkJCQlHUE1DX0NPTkZJR1goNiwgY3MpCisjZGVmaW5lIEdQTUNfQ09ORklHNyhjcykJCQkJR1BNQ19DT05GSUdYKDcsIGNzKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV8wCQkJCQlHUE1DX0NPTkZJRzEoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzAJCQkJCUdQTUNfQ09ORklHMigwKQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMAkJCQkJR1BNQ19DT05GSUczKDApCisjZGVmaW5lIEdQTUNfQ09ORklHNF8wCQkJCQlHUE1DX0NPTkZJRzQoMCkKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzAJCQkJCUdQTUNfQ09ORklHNSgwKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMAkJCQkJR1BNQ19DT05GSUc2KDApCisjZGVmaW5lIEdQTUNfQ09ORklHN18wCQkJCQlHUE1DX0NPTkZJRzcoMCkKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfMQkJCQkJR1BNQ19DT05GSUcxKDEpCisjZGVmaW5lIEdQTUNfQ09ORklHMl8xCQkJCQlHUE1DX0NPTkZJRzIoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzEJCQkJCUdQTUNfQ09ORklHMygxKQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMQkJCQkJR1BNQ19DT05GSUc0KDEpCisjZGVmaW5lIEdQTUNfQ09ORklHNV8xCQkJCQlHUE1DX0NPTkZJRzUoMSkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzEJCQkJCUdQTUNfQ09ORklHNigxKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfMQkJCQkJR1BNQ19DT05GSUc3KDEpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzIJCQkJCUdQTUNfQ09ORklHMSgyKQorI2RlZmluZSBHUE1DX0NPTkZJRzJfMgkJCQkJR1BNQ19DT05GSUcyKDIpCisjZGVmaW5lIEdQTUNfQ09ORklHM18yCQkJCQlHUE1DX0NPTkZJRzMoMikKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzIJCQkJCUdQTUNfQ09ORklHNSgyKQorI2RlZmluZSBHUE1DX0NPTkZJRzRfMgkJCQkJR1BNQ19DT05GSUc0KDIpCisjZGVmaW5lIEdQTUNfQ09ORklHNl8yCQkJCQlHUE1DX0NPTkZJRzYoMikKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzIJCQkJCUdQTUNfQ09ORklHNygyKQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV8zCQkJCQlHUE1DX0NPTkZJRzEoMykKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzMJCQkJCUdQTUNfQ09ORklHMigzKQorI2RlZmluZSBHUE1DX0NPTkZJRzNfMwkJCQkJR1BNQ19DT05GSUczKDMpCisjZGVmaW5lIEdQTUNfQ09ORklHNF8zCQkJCQlHUE1DX0NPTkZJRzQoMykKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzMJCQkJCUdQTUNfQ09ORklHNSgzKQorI2RlZmluZSBHUE1DX0NPTkZJRzZfMwkJCQkJR1BNQ19DT05GSUc2KDMpCisjZGVmaW5lIEdQTUNfQ09ORklHN18zCQkJCQlHUE1DX0NPTkZJRzcoMykKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfNAkJCQkJR1BNQ19DT05GSUcxKDQpCisjZGVmaW5lIEdQTUNfQ09ORklHMl80CQkJCQlHUE1DX0NPTkZJRzIoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUczXzQJCQkJCUdQTUNfQ09ORklHMyg0KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfNAkJCQkJR1BNQ19DT05GSUc0KDQpCisjZGVmaW5lIEdQTUNfQ09ORklHNV80CQkJCQlHUE1DX0NPTkZJRzUoNCkKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzQJCQkJCUdQTUNfQ09ORklHNig0KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfNAkJCQkJR1BNQ19DT05GSUc3KDQpCisKKyNkZWZpbmUgR1BNQ19DT05GSUcxXzUJCQkJCUdQTUNfQ09ORklHMSg1KQorI2RlZmluZSBHUE1DX0NPTkZJRzJfNQkJCQkJR1BNQ19DT05GSUcyKDUpCisjZGVmaW5lIEdQTUNfQ09ORklHM181CQkJCQlHUE1DX0NPTkZJRzMoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUc0XzUJCQkJCUdQTUNfQ09ORklHNCg1KQorI2RlZmluZSBHUE1DX0NPTkZJRzVfNQkJCQkJR1BNQ19DT05GSUc1KDUpCisjZGVmaW5lIEdQTUNfQ09ORklHNl81CQkJCQlHUE1DX0NPTkZJRzYoNSkKKyNkZWZpbmUgR1BNQ19DT05GSUc3XzUJCQkJCUdQTUNfQ09ORklHNyg1KQorCisjZGVmaW5lIEdQTUNfQ09ORklHMV82CQkJCQlHUE1DX0NPTkZJRzEoNikKKyNkZWZpbmUgR1BNQ19DT05GSUcyXzYJCQkJCUdQTUNfQ09ORklHMig2KQorI2RlZmluZSBHUE1DX0NPTkZJRzNfNgkJCQkJR1BNQ19DT05GSUczKDYpCisjZGVmaW5lIEdQTUNfQ09ORklHNF82CQkJCQlHUE1DX0NPTkZJRzQoNikKKyNkZWZpbmUgR1BNQ19DT05GSUc1XzYJCQkJCUdQTUNfQ09ORklHNSg2KQorI2RlZmluZSBHUE1DX0NPTkZJRzZfNgkJCQkJR1BNQ19DT05GSUc2KDYpCisjZGVmaW5lIEdQTUNfQ09ORklHN182CQkJCQlHUE1DX0NPTkZJRzcoNikKKworI2RlZmluZSBHUE1DX0NPTkZJRzFfNwkJCQkJR1BNQ19DT05GSUcxKDcpCisjZGVmaW5lIEdQTUNfQ09ORklHMl83CQkJCQlHUE1DX0NPTkZJRzIoNykKKyNkZWZpbmUgR1BNQ19DT05GSUczXzcJCQkJCUdQTUNfQ09ORklHMyg3KQorI2RlZmluZSBHUE1DX0NPTkZJRzRfNwkJCQkJR1BNQ19DT05GSUc0KDcpCisjZGVmaW5lIEdQTUNfQ09ORklHNV83CQkJCQlHUE1DX0NPTkZJRzUoNykKKyNkZWZpbmUgR1BNQ19DT05GSUc2XzcJCQkJCUdQTUNfQ09ORklHNig3KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfNwkJCQkJR1BNQ19DT05GSUc3KDcpCisKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkQoaSkJCQkoR1BNQ19CQVNFICsgMHgwMDdDICsgKChpKSAqIDB4MDAzMCkpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAJCQkJR1BNQ19OQU5EX0NPTU1BTkQoMCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMQkJCQlHUE1DX05BTkRfQ09NTUFORCgxKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8yCQkJCUdQTUNfTkFORF9DT01NQU5EKDIpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzMJCQkJR1BNQ19OQU5EX0NPTU1BTkQoMykKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfNAkJCQlHUE1DX05BTkRfQ09NTUFORCg0KQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF81CQkJCUdQTUNfTkFORF9DT01NQU5EKDUpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzYJCQkJR1BNQ19OQU5EX0NPTU1BTkQoNikKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfNwkJCQlHUE1DX05BTkRfQ09NTUFORCg3KQorCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTKGkpCQkJKEdQTUNfQkFTRSArIDB4MDA4MCArICgoaSkgKiAweDAwMzApKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wCQkJCUdQTUNfTkFORF9BRERSRVNTKDApCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzEJCQkJR1BNQ19OQU5EX0FERFJFU1MoMSkKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMgkJCQlHUE1DX05BTkRfQUREUkVTUygyKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18zCQkJCUdQTUNfTkFORF9BRERSRVNTKDMpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzQJCQkJR1BNQ19OQU5EX0FERFJFU1MoNCkKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfNQkJCQlHUE1DX05BTkRfQUREUkVTUyg1KQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU182CQkJCUdQTUNfTkFORF9BRERSRVNTKDYpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzcJCQkJR1BNQ19OQU5EX0FERFJFU1MoNykKKworI2RlZmluZSBHUE1DX05BTkRfREFUQShpKQkJCQkoR1BNQ19CQVNFICsgMHgwMDg0ICsgKChpKSAqIDB4MDAzMCkpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAJCQkJR1BNQ19OQU5EX0RBVEEoMCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMQkJCQlHUE1DX05BTkRfREFUQSgxKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8yCQkJCUdQTUNfTkFORF9EQVRBKDIpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzMJCQkJR1BNQ19OQU5EX0RBVEEoMykKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfNAkJCQlHUE1DX05BTkRfREFUQSg0KQorI2RlZmluZSBHUE1DX05BTkRfREFUQV81CQkJCUdQTUNfTkFORF9EQVRBKDUpCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzYJCQkJR1BNQ19OQU5EX0RBVEEoNikKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfNwkJCQlHUE1DX05BTkRfREFUQSg3KQorCisjZGVmaW5lIEdQTUNfUFJFRkVUQ0hfQ09ORklHMQkJCShHUE1DX0JBU0UgKyAweDAxRTApCisjZGVmaW5lIEdQTUNfUFJFRkVUQ0hfQ09ORklHMgkJCShHUE1DX0JBU0UgKyAweDAxRTQpCisjZGVmaW5lIEdQTUNfUFJFRkVUQ0hfQ09OVFJPTAkJCShHUE1DX0JBU0UgKyAweDAxRUMpCisjZGVmaW5lIEdQTUNfUFJFRkVUQ0hfU1RBVFVTCQkJKEdQTUNfQkFTRSArIDB4MDFGMCkKKworI2RlZmluZSBHUE1DX0VDQ19DT05GSUcJCQkJCShHUE1DX0JBU0UgKyAweDAxRjQpCisjZGVmaW5lIEdQTUNfRUNDX0NPTlRST0wJCQkJKEdQTUNfQkFTRSArIDB4MDFGOCkKKyNkZWZpbmUgR1BNQ19FQ0NfU0laRV9DT05GSUcJCQkoR1BNQ19CQVNFICsgMHgwMUZDKQorI2RlZmluZSBHUE1DX0VDQ19SRVNVTFQoaikJCQkJKEdQTUNfQkFTRSArIDB4MDIwMCArIFwKKwkJCQkJCQkJCQkgKCgoaikgLSAxKSAqIDB4MDAwNCkpCisjZGVmaW5lIEdQTUNfRUNDMV9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDEpCisjZGVmaW5lIEdQTUNfRUNDMl9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDIpCisjZGVmaW5lIEdQTUNfRUNDM19SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDMpCisjZGVmaW5lIEdQTUNfRUNDNF9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDQpCisjZGVmaW5lIEdQTUNfRUNDNV9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDUpCisjZGVmaW5lIEdQTUNfRUNDNl9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDYpCisjZGVmaW5lIEdQTUNfRUNDN19SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDcpCisjZGVmaW5lIEdQTUNfRUNDOF9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDgpCisjZGVmaW5lIEdQTUNfRUNDOV9SRVNVTFQJCQkJR1BNQ19FQ0NfUkVTVUxUKDkpCisKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMChpKQkJCQkoR1BNQ19CQVNFICsgMHgwMjQwICsgKChpKSAqIDB4MDAxMCkpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfMAkJCQlHUE1DX0JDSF9SRVNVTFQwKDApCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfMQkJCQlHUE1DX0JDSF9SRVNVTFQwKDEpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfMgkJCQlHUE1DX0JDSF9SRVNVTFQwKDIpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfMwkJCQlHUE1DX0JDSF9SRVNVTFQwKDMpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfNAkJCQlHUE1DX0JDSF9SRVNVTFQwKDQpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfNQkJCQlHUE1DX0JDSF9SRVNVTFQwKDUpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfNgkJCQlHUE1DX0JDSF9SRVNVTFQwKDYpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDBfNwkJCQlHUE1DX0JDSF9SRVNVTFQwKDcpCisKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMShpKSAJCQkoR1BNQ19CQVNFICsgMHgwMjQ0ICsgKChpKSAqIDB4MDAxMCkpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfMAkJCQlHUE1DX0JDSF9SRVNVTFQxKDApCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfMQkJCQlHUE1DX0JDSF9SRVNVTFQxKDEpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfMgkJCQlHUE1DX0JDSF9SRVNVTFQxKDIpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfMwkJCQlHUE1DX0JDSF9SRVNVTFQxKDMpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfNAkJCQlHUE1DX0JDSF9SRVNVTFQxKDQpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfNQkJCQlHUE1DX0JDSF9SRVNVTFQxKDUpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfNgkJCQlHUE1DX0JDSF9SRVNVTFQxKDYpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDFfNwkJCQlHUE1DX0JDSF9SRVNVTFQxKDcpCisKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMihpKSAJCQkoR1BNQ19CQVNFICsgMHgwMjQ4ICsgKChpKSAqIDB4MDAxMCkpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfMAkJCQlHUE1DX0JDSF9SRVNVTFQyKDApCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfMQkJCQlHUE1DX0JDSF9SRVNVTFQyKDEpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfMgkJCQlHUE1DX0JDSF9SRVNVTFQyKDIpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfMwkJCQlHUE1DX0JDSF9SRVNVTFQyKDMpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfNAkJCQlHUE1DX0JDSF9SRVNVTFQyKDQpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfNQkJCQlHUE1DX0JDSF9SRVNVTFQyKDUpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfNgkJCQlHUE1DX0JDSF9SRVNVTFQyKDYpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDJfNwkJCQlHUE1DX0JDSF9SRVNVTFQyKDcpCisKKyNkZWZpbmUgR1BNQ19CQ0hfUkVTVUxUMyhpKSAJCQkoR1BNQ19CQVNFICsgMHgwMjRDICsgKChpKSAqIDB4MDAxMCkpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfMAkJCQlHUE1DX0JDSF9SRVNVTFQzKDApCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfMQkJCQlHUE1DX0JDSF9SRVNVTFQzKDEpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfMgkJCQlHUE1DX0JDSF9SRVNVTFQzKDIpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfMwkJCQlHUE1DX0JDSF9SRVNVTFQzKDMpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfNAkJCQlHUE1DX0JDSF9SRVNVTFQzKDQpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfNQkJCQlHUE1DX0JDSF9SRVNVTFQzKDUpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfNgkJCQlHUE1DX0JDSF9SRVNVTFQzKDYpCisjZGVmaW5lIEdQTUNfQkNIX1JFU1VMVDNfNwkJCQlHUE1DX0JDSF9SRVNVTFQzKDcpCisKKyNkZWZpbmUgR1BNQ19CQ0hfU1dEQVRBIAkJCQkoR1BNQ19CQVNFICsgMHgwMkQwKQorCisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKQorI2RlZmluZSBHUE1DX0NPTkZJR19DUzAJCShPTUFQMzRYWF9HUE1DX0JBU0UrMHg2MCkKKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisjZGVmaW5lIEdQTUNfQ09ORklHX0NTMAkJKE9NQVAzNFhYX0dQTUNfQkFTRSsweEMwKQorI2VuZGlmCisKKy8qIEdQTUMgTWFwcGluZyAqLworIyBkZWZpbmUgRkxBU0hfQkFTRQkJMHgxMDAwMDAwMCAgLyogTk9SIGZsYXNoIChhbGlnbmVkIHRvIDI1NiBNZWcpICovCisjIGRlZmluZSBGTEFTSF9CQVNFX1NEUFYxCTB4MDQwMDAwMDAgIC8qIE5PUiBmbGFzaCAoYWxpZ25lZCB0byA2NCBNZWcpICovCisjIGRlZmluZSBGTEFTSF9CQVNFX1NEUFYyCTB4MTAwMDAwMDAgIC8qIE5PUiBmbGFzaCAoYWxpZ25lZCB0byAyNTYgTWVnKSAqLworIyBkZWZpbmUgREVCVUdfQkFTRQkJMHgwODAwMDAwMCAgLyogZGVidWcgYm9hcmQgKi8KKyMgZGVmaW5lIE5BTkRfQkFTRQkJMHgzMDAwMDAwMCAgLyogTkFORCBhZGRyIChhY3R1YWwgc2l6ZSBzbWFsbCBwb3J0KSovCisjIGRlZmluZSBQSVNNTzJfQkFTRQkJMHgxODAwMDAwMCAgLyogUElTTU8yIENTMS8yICovCisjIGRlZmluZSBPTkVOQU5EX01BUAkJMHgyMDAwMDAwMCAgLyogT25lTmFuZCBhZGRyIChhY3R1YWwgc2l6ZSBzbWFsbCBwb3J0ICovCisKKy8qIFNNUyAqLworI2RlZmluZSBTTVNfU1lTQ09ORklHCQkoT01BUDM0WFhfU01TX0JBU0UrMHgxMCkKKyNkZWZpbmUgU01TX1JHX0FUVDAJCShPTUFQMzRYWF9TTVNfQkFTRSsweDQ4KQorI2RlZmluZSBTTVNfQ0xBU1NfQVJCMAkJKE9NQVAzNFhYX1NNU19CQVNFKzB4RDApCisjZGVmaW5lIEJVUlNUQ09NUExFVEVfR1JPVVA3CUJJVDMxCisKKy8qIFNEUkMgKi8KKyNkZWZpbmUgU0RSQ19SRVZJU0lPTgkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4MDApCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgU0RSQ19TWVNTVEFUVVMJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDE0KQorI2RlZmluZQlTRFJDX1NUQVRVUwkJCVNEUkNfU1lTU1RBVFVTCisjZGVmaW5lIFNEUkNfQ1NfQ0ZHCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NDApCisjZGVmaW5lIFNEUkNfU0hBUklORwkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NDQpCisjZGVmaW5lIFNEUkNfRVJSX0FERFIJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDQ4KQorI2RlZmluZSBTRFJDX0VSUl9UWVBFCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg0QykKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkwJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDYwKQorI2RlZmluZSBTRFJDX0RMTEFfU1RBVFVTCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweDY0KQorI2RlZmluZSBTRFJDX0RMTEJfQ1RSTAkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NjgpCisjZGVmaW5lIFNEUkNfRExMQl9TVEFUVVMJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4NkMpCisjZGVmaW5lIERMTFBIQVNFCQlCSVQxCisjZGVmaW5lIExPQURETEwJCQlCSVQyCisjZGVmaW5lIERMTF9ERUxBWV9NQVNLCQkweEZGMDAKKyNkZWZpbmUgRExMX05PX0ZJTFRFUl9NQVNLCShCSVQ4fEJJVDkpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg3MCkKKyNkZWZpbmUgU0RSQ19QT1dFUgkJCVNEUkNfUE9XRVJfUkVHCisjZGVmaW5lIFdBS0VVUFBST0MJCUJJVDI2CisKKyNkZWZpbmUgU0RSQ19NQ0ZHXzAJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg4MCkKKyNkZWZpbmUgU0RSQ19NUl8wCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4ODQpCisjZGVmaW5lIFNEUkNfRU1SMl8wCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4OEMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMAkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHg5QykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8wCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEEwKQorI2RlZmluZSBTRFJDX1JGUl9DVFJMXzAJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEE0KQorI2RlZmluZSBTRFJDX01BTlVBTF8wCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhBOCkKKyNkZWZpbmUgU0RSQ19NQ0ZHXzEJCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhCMCkKKyNkZWZpbmUgU0RSQ19NUl8xCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QjQpCisjZGVmaW5lIFNEUkNfRU1SMl8xCQkJKE9NQVAzNFhYX1NEUkNfQkFTRSArIDB4QkMpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfMQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhDNCkKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl8xCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEM4KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMXzEJCShPTUFQMzRYWF9TRFJDX0JBU0UgKyAweEQ0KQorI2RlZmluZSBTRFJDX01BTlVBTF8xCQkoT01BUDM0WFhfU0RSQ19CQVNFICsgMHhEOCkKKyNkZWZpbmUgT01BUDM0WFhfU0RSQ19DUzAJMHg4MDAwMDAwMAorI2RlZmluZSBPTUFQMzRYWF9TRFJDX0NTMQkweEEwMDAwMDAwCisjZGVmaW5lIENNRF9OT1AJCQkweDAKKyNkZWZpbmUgQ01EX1BSRUNIQVJHRQkJMHgxCisjZGVmaW5lIENNRF9BVVRPUkVGUkVTSAkJMHgyCisjZGVmaW5lIENNRF9FTlRSX1BXUkRPV04JMHgzCisjZGVmaW5lIENNRF9FWElUX1BXUkRPV04JMHg0CisjZGVmaW5lIENNRF9FTlRSX1NSRlJTSAkJMHg1CisjZGVmaW5lIENNRF9DS0VfSElHSAkJMHg2CisjZGVmaW5lIENNRF9DS0VfTE9XCQkweDcKKyNkZWZpbmUgU09GVFJFU0VUCQlCSVQxCisjZGVmaW5lIFNNQVJUX0lETEUJCSgweDIgPDwgMykKKyNkZWZpbmUgUkVGX09OX0lETEUJCSgweDEgPDwgNikKKworLyogRU1JRjQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJRU1JRjRfQkFTRQkJT01BUDM0WFhfU0RSQ19CQVNFCisjZGVmaW5lCUVNSUY0X01PRF9JRAkJKEVNSUY0X0JBU0UgKyAweDAwKQorI2RlZmluZQlFTUlGNF9TRFJBTV9TVFMJCShFTUlGNF9CQVNFICsgMHgwNCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fQ0ZHCQkoRU1JRjRfQkFTRSArIDB4MDgpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1JGQ1IJKEVNSUY0X0JBU0UgKyAweDEwKQorI2RlZmluZQlFTUlGNF9TRFJBTV9SRkNSX1NIRFcJKEVNSUY0X0JBU0UgKyAweDE0KQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0xCShFTUlGNF9CQVNFICsgMHgxOCkKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNMV9TSERXCShFTUlGNF9CQVNFICsgMHgxQykKKyNkZWZpbmUJRU1JRjRfU0RSQU1fVElNMgkoRU1JRjRfQkFTRSArIDB4MjApCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTJfU0hEVwkoRU1JRjRfQkFTRSArIDB4MjQpCisjZGVmaW5lCUVNSUY0X1NEUkFNX1RJTTMJKEVNSUY0X0JBU0UgKyAweDI4KQorI2RlZmluZQlFTUlGNF9TRFJBTV9USU0zX1NIRFcJKEVNSUY0X0JBU0UgKyAweDJjKQorI2RlZmluZQlFTUlGNF9QV1JfTUdUX0NUUkwJKEVNSUY0X0JBU0UgKyAweDM4KQorI2RlZmluZQlFTUlGNF9QV1JfTUdUX0NUUkxfU0hEVwkoRU1JRjRfQkFTRSArIDB4M0MpCisjZGVmaW5lCUVNSUY0X0lPREZUX1RMR0MJKEVNSUY0X0JBU0UgKyAweDYwKQorI2RlZmluZQlFTUlGNF9ERFJfUEhZQ1RMMQkoRU1JRjRfQkFTRSArIDB4RTQpCisjZGVmaW5lCUVNSUY0X0REUl9QSFlDVEwxX1NIRFcJKEVNSUY0X0JBU0UgKyAweEU4KQorI2RlZmluZQlFTUlGNF9ERFJfUEhZQ1RMMgkoRU1JRjRfQkFTRSArIDB4RUMpCisKKworLyogdGltZXIgcmVncyBvZmZzZXRzICgzMiBiaXQgcmVncykgKi8KKyNkZWZpbmUgVElEUgkJCTB4MCAgICAgIC8qIHIgKi8KKyNkZWZpbmUgVElPQ1BfQ0ZHCQkweDEwICAgICAvKiBydyAqLworI2RlZmluZSBUSVNUQVQJCQkweDE0ICAgICAvKiByICovCisjZGVmaW5lIFRJU1IJCQkweDE4ICAgICAvKiBydyAqLworI2RlZmluZSBUSUVSCQkJMHgxQyAgICAgLyogcncgKi8KKyNkZWZpbmUgVFdFUgkJCTB4MjAgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRDTFIJCQkweDI0ICAgICAvKiBydyAqLworI2RlZmluZSBUQ1JSCQkJMHgyOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVExEUgkJCTB4MkMgICAgIC8qIHJ3ICovCisjZGVmaW5lIFRUR1IJCQkweDMwICAgICAvKiBydyAqLworI2RlZmluZSBUV1BTCQkJMHgzNCAgICAgLyogciAqLworI2RlZmluZSBUTUFSCQkJMHgzOCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjEJCQkweDNjICAgICAvKiByICovCisjZGVmaW5lIFRTSUNSCQkJMHg0MCAgICAgLyogcncgKi8KKyNkZWZpbmUgVENBUjIJCQkweDQ0ICAgICAvKiByICovCisjZGVmaW5lIEdQVF9FTgkJCSgoMDw8Mil8QklUMXxCSVQwKSAvKiBlbmFibGUgc3lzX2NsayBOTy1wcmVzY2FsZSAvMSAqLworCisvKiBXYXRjaGRvZyAqLworI2RlZmluZSBXV1BTCQkJMHgzNCAgICAgLyogciAqLworI2RlZmluZSBXU1BSCQkJMHg0OCAgICAgLyogcncgKi8KKyNkZWZpbmUgV0RfVU5MT0NLMQkJMHhBQUFBCisjZGVmaW5lIFdEX1VOTE9DSzIJCTB4NTU1NQorCisvKiBQUkNNICovCisjZGVmaW5lIENNX0ZDTEtFTl9JVkEyICAgICAgMHg0ODAwNDAwMAorI2RlZmluZSBDTV9DTEtFTl9QTExfSVZBMiAgIDB4NDgwMDQwMDQKKyNkZWZpbmUgQ01fSURMRVNUX1BMTF9JVkEyICAweDQ4MDA0MDI0CisjZGVmaW5lIENNX0NMS1NFTDFfUExMX0lWQTIgMHg0ODAwNDA0MAorI2RlZmluZSBDTV9DTEtTRUwyX1BMTF9JVkEyIDB4NDgwMDQwNDQKKyNkZWZpbmUgQ01fQ0xLRU5fUExMX01QVSAgICAweDQ4MDA0OTA0CisjZGVmaW5lIENNX0lETEVTVF9QTExfTVBVICAgMHg0ODAwNDkyNAorI2RlZmluZSBDTV9DTEtTRUwxX1BMTF9NUFUgIDB4NDgwMDQ5NDAKKyNkZWZpbmUgQ01fQ0xLU0VMMl9QTExfTVBVICAweDQ4MDA0OTQ0CisjZGVmaW5lIENNX0ZDTEtFTjFfQ09SRSAgICAgMHg0ODAwNGEwMAorI2RlZmluZSBDTV9JQ0xLRU4xX0NPUkUgICAgIDB4NDgwMDRhMTAKKyNkZWZpbmUgQ01fSUNMS0VOMl9DT1JFICAgICAweDQ4MDA0YTE0CisjZGVmaW5lIENNX0NMS1NFTF9DT1JFICAgICAgMHg0ODAwNGE0MAorI2RlZmluZSBDTV9GQ0xLRU5fR0ZYICAgICAgIDB4NDgwMDRiMDAKKyNkZWZpbmUgQ01fSUNMS0VOX0dGWCAgICAgICAweDQ4MDA0YjEwCisjZGVmaW5lIENNX0NMS1NFTF9HRlggICAgICAgMHg0ODAwNGI0MAorI2RlZmluZSBDTV9GQ0xLRU5fV0tVUCAgICAgIDB4NDgwMDRjMDAKKyNkZWZpbmUgQ01fSUNMS0VOX1dLVVAgICAgICAweDQ4MDA0YzEwCisjZGVmaW5lIENNX0NMS1NFTF9XS1VQICAgICAgMHg0ODAwNGM0MAorI2RlZmluZSBDTV9JRExFU1RfV0tVUCAgICAgIDB4NDgwMDRjMjAKKyNkZWZpbmUgQ01fQ0xLRU5fUExMICAgICAgICAweDQ4MDA0ZDAwCisjZGVmaW5lIENNX0lETEVTVF9DS0dFTiAgICAgMHg0ODAwNGQyMAorI2RlZmluZSBDTV9DTEtTRUwxX1BMTCAgICAgIDB4NDgwMDRkNDAKKyNkZWZpbmUgQ01fQ0xLU0VMMl9QTEwgICAgICAweDQ4MDA0ZDQ0CisjZGVmaW5lIENNX0NMS1NFTDNfUExMICAgICAgMHg0ODAwNGQ0OAorI2RlZmluZSBDTV9GQ0xLRU5fRFNTICAgICAgIDB4NDgwMDRlMDAKKyNkZWZpbmUgQ01fSUNMS0VOX0RTUyAgICAgICAweDQ4MDA0ZTEwCisjZGVmaW5lIENNX0NMS1NFTF9EU1MgICAgICAgMHg0ODAwNGU0MAorI2RlZmluZSBDTV9GQ0xLRU5fQ0FNICAgICAgIDB4NDgwMDRmMDAKKyNkZWZpbmUgQ01fSUNMS0VOX0NBTSAgICAgICAweDQ4MDA0ZjEwCisjZGVmaW5lIENNX0NMS1NFTF9DQU0gICAgICAgMHg0ODAwNEY0MAorI2RlZmluZSBDTV9GQ0xLRU5fUEVSICAgICAgIDB4NDgwMDUwMDAKKyNkZWZpbmUgQ01fSUNMS0VOX1BFUiAgICAgICAweDQ4MDA1MDEwCisjZGVmaW5lIENNX0NMS1NFTF9QRVIgICAgICAgMHg0ODAwNTA0MAorI2RlZmluZSBDTV9DTEtTRUwxX0VNVSAgICAgIDB4NDgwMDUxNDAKKworLyogU01YLUFQRSAqLworI2RlZmluZSBQTV9SVF9BUEVfQkFTRV9BRERSX0FSTQkJKFNNWF9BUEVfQkFTRSArIDB4MTAwMDApCisjZGVmaW5lIFBNX0dQTUNfQkFTRV9BRERSX0FSTQkJKFNNWF9BUEVfQkFTRSArIDB4MTI0MDApCisjZGVmaW5lIFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTQkoU01YX0FQRV9CQVNFICsgMHgxMjgwMCkKKyNkZWZpbmUgUE1fT0NNX1JPTV9CQVNFX0FERFJfQVJNCShTTVhfQVBFX0JBU0UgKyAweDEyQzAwKQorI2RlZmluZSBQTV9JVkEyX0JBU0VfQUREUl9BUk0JCShTTVhfQVBFX0JBU0UgKyAweDE0MDAwKQorCisjZGVmaW5lIFJUX1JFUV9JTkZPX1BFUk1JU1NJT05fMQkoUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDY4KQorI2RlZmluZSBSVF9SRUFEX1BFUk1JU1NJT05fMAkoUE1fUlRfQVBFX0JBU0VfQUREUl9BUk0gKyAweDUwKQorI2RlZmluZSBSVF9XUklURV9QRVJNSVNTSU9OXzAJKFBNX1JUX0FQRV9CQVNFX0FERFJfQVJNICsgMHg1OCkKKyNkZWZpbmUgUlRfQUREUl9NQVRDSF8xCShQTV9SVF9BUEVfQkFTRV9BRERSX0FSTSArIDB4NjApCisKKyNkZWZpbmUgR1BNQ19SRVFfSU5GT19QRVJNSVNTSU9OXzAJKFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NDgpCisjZGVmaW5lIEdQTUNfUkVBRF9QRVJNSVNTSU9OXzAJKFBNX0dQTUNfQkFTRV9BRERSX0FSTSArIDB4NTApCisjZGVmaW5lIEdQTUNfV1JJVEVfUEVSTUlTU0lPTl8wCShQTV9HUE1DX0JBU0VfQUREUl9BUk0gKyAweDU4KQorCisjZGVmaW5lIE9DTV9SRVFfSU5GT19QRVJNSVNTSU9OXzAJKFBNX09DTV9SQU1fQkFTRV9BRERSX0FSTSArIDB4NDgpCisjZGVmaW5lIE9DTV9SRUFEX1BFUk1JU1NJT05fMAkoUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1MCkKKyNkZWZpbmUgT0NNX1dSSVRFX1BFUk1JU1NJT05fMAkoUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg1OCkKKyNkZWZpbmUgT0NNX0FERFJfTUFUQ0hfMgkoUE1fT0NNX1JBTV9CQVNFX0FERFJfQVJNICsgMHg4MCkKKworI2RlZmluZSBJVkEyX1JFUV9JTkZPX1BFUk1JU1NJT05fMAkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg0OCkKKyNkZWZpbmUgSVZBMl9SRUFEX1BFUk1JU1NJT05fMAkoUE1fSVZBMl9CQVNFX0FERFJfQVJNICsgMHg1MCkKKyNkZWZpbmUgSVZBMl9XUklURV9QRVJNSVNTSU9OXzAJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NTgpCisKKyNkZWZpbmUgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzEJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NjgpCisjZGVmaW5lIElWQTJfUkVBRF9QRVJNSVNTSU9OXzEJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDcwKQorI2RlZmluZSBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMQkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4NzgpCisKKyNkZWZpbmUgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzIJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4ODgpCisjZGVmaW5lIElWQTJfUkVBRF9QRVJNSVNTSU9OXzIJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweDkwKQorI2RlZmluZSBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMgkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4OTgpCisKKyNkZWZpbmUgSVZBMl9SRVFfSU5GT19QRVJNSVNTSU9OXzMJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4QTgpCisjZGVmaW5lIElWQTJfUkVBRF9QRVJNSVNTSU9OXzMJCShQTV9JVkEyX0JBU0VfQUREUl9BUk0gKyAweEIwKQorI2RlZmluZSBJVkEyX1dSSVRFX1BFUk1JU1NJT05fMwkJKFBNX0lWQTJfQkFTRV9BRERSX0FSTSArIDB4QjgpCisKKy8qIEkyQyBiYXNlICovCisjZGVmaW5lIEkyQ19CQVNFMQkJKE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRSArIDB4NzAwMDApCisjZGVmaW5lIEkyQ19CQVNFMgkJKE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRSArIDB4NzIwMDApCisjZGVmaW5lIEkyQ19CQVNFMwkJKE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRSArIDB4NjAwMDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9ncG1jLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2dwbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIxMWQ5Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9ncG1jLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBmaWVsZCBjb25zdGFudHMgYW5kCisgKiAgICAgIG1hY3JvcyBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIE9wZW4gTXVsdGltZWRpYSBBcHBsaWNhdGlvbgorICogICAgICBQbGF0Zm9ybSAoT01BUCkgMyBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpLgorICovCisKKyNpZm5kZWYgX09NQVAzX0dQTUNfSAorI2RlZmluZSBfT01BUDNfR1BNQ19ICisKKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisKKy8qCisgKiBHUE1DIEludGVyY29ubmVjdCBDb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfQVVUT0lETEVfRElTQUJMRQkJCQkJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfQVVUT0lETEVfRU5BQkxFCQkJCQlBUk1fUkVHX1ZBTCgwLCAxKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19TT0ZUUkVTRVQJCQkJCQlBUk1fUkVHX1ZBTCgxLCAxKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JRExFTU9ERV9GT1JDRQkJCQkJQVJNX1JFR19WQUwoMywgMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSURMRU1PREVfTk9ORQkJCQkJQVJNX1JFR19WQUwoMywgMSkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSURMRU1PREVfU01BUlQJCQkJCUFSTV9SRUdfVkFMKDMsIDIpCisKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX0ZJRk9FVkVOVF9ESVNBQkxFCQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfRklGT0VWRU5UX0VOQUJMRQkJQVJNX1JFR19WQUwoMCwgMSkKKworI2RlZmluZSBHUE1DX1NZU0NPTkZJR19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVF9ESVNBQkxFCUFSTV9SRUdfVkFMKDAsIDApCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9URVJNSU5BTENPVU5UX0VOQUJMRQlBUk1fUkVHX1ZBTCgwLCAxKQorCisjZGVmaW5lIEdQTUNfU1lTQ09ORklHX0lSUUVOQUJMRV9URVJNSU5BTENPVU5UX0RJU0FCTEUJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19TWVNDT05GSUdfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRfRU5BQkxFCUFSTV9SRUdfVkFMKDAsIDEpCisKKy8qCisgKiBHUE1DIEludGVycnVwdCBDb250cm9sCisgKi8KKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9XQUlUM0VER0VERVRFQ1RJT05fRElTQUJMRQkJQVJNX1JFR19WQUwoMTEsIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQzRURHRURFVEVDVElPTl9FTkFCTEUJCUFSTV9SRUdfVkFMKDExLCAxKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQyRURHRURFVEVDVElPTl9ESVNBQkxFCQlBUk1fUkVHX1ZBTCgxMCwgMCkKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDJFREdFREVURUNUSU9OX0VOQUJMRQkJQVJNX1JFR19WQUwoMTAsIDEpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDFFREdFREVURUNUSU9OX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDksIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQxRURHRURFVEVDVElPTl9FTkFCTEUJCUFSTV9SRUdfVkFMKDksIDEpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfV0FJVDBFREdFREVURUNUSU9OX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDgsIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1dBSVQwRURHRURFVEVDVElPTl9FTkFCTEUJCUFSTV9SRUdfVkFMKDgsIDEpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVEVWRU5UX0RJU0FCTEUJCUFSTV9SRUdfVkFMKDEsIDApCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRFVkVOVF9FTkFCTEUJCUFSTV9SRUdfVkFMKDEsIDEpCisKKyNkZWZpbmUgR1BNQ19JUlFFTkFCTEVfRklGT0VWRU5URU5BQkxFX0RJU0FCTEUJCQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9GSUZPRVZFTlRFTkFCTEVfRU5BQkxFCQkJQVJNX1JFR19WQUwoMCwgMCkKKworI2RlZmluZSBHUE1DX0lSUUVOQUJMRV9BTExfRElTQUJMRQkJCQkJXAorCShHUE1DX0lSUUVOQUJMRV9XQUlUM0VER0VERVRFQ1RJT05fRElTQUJMRSB8CVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDJFREdFREVURUNUSU9OX0RJU0FCTEUgfAlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQxRURHRURFVEVDVElPTl9ESVNBQkxFIHwJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMEVER0VERVRFQ1RJT05fRElTQUJMRSB8CVwKKwkgR1BNQ19JUlFFTkFCTEVfVEVSTUlOQUxDT1VOVEVWRU5UX0RJU0FCTEUgfAlcCisJIEdQTUNfSVJRRU5BQkxFX0ZJRk9FVkVOVEVOQUJMRV9ESVNBQkxFKQorCisjZGVmaW5lIEdQTUNfSVJRRU5BQkxFX0FMTF9FTkFCTEUJCQkJCVwKKwkoR1BNQ19JUlFFTkFCTEVfV0FJVDNFREdFREVURUNUSU9OX0VOQUJMRSB8CQlcCisJIEdQTUNfSVJRRU5BQkxFX1dBSVQyRURHRURFVEVDVElPTl9FTkFCTEUgfAkJXAorCSBHUE1DX0lSUUVOQUJMRV9XQUlUMUVER0VERVRFQ1RJT05fRU5BQkxFIHwJCVwKKwkgR1BNQ19JUlFFTkFCTEVfV0FJVDBFREdFREVURUNUSU9OX0VOQUJMRSB8CQlcCisJIEdQTUNfSVJRRU5BQkxFX1RFUk1JTkFMQ09VTlRFVkVOVF9FTkFCTEUgfAkJXAorCSBHUE1DX0lSUUVOQUJMRV9GSUZPRVZFTlRFTkFCTEVfRU5BQkxFKQorCisvKgorICogR1BNQyBUaW1lb3V0IENvdW50ZXIgQ29udHJvbAorICovCisKKyNkZWZpbmUgR1BNQ19USU1FT1VUU1RBUlRWQUxVRV9NQVNLCQkJCQkJQVJNX1JFR19WQUwoNCwgMHgxRkYpCisjZGVmaW5lIEdQTUNfVElNRU9VVFNUQVJUVkFMVUVfRU5DT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0VOQ09ERSg0LCBHUE1DX1RJTUVPVVRTVEFSVFZBTFVFX01BU0ssIHYpCisjZGVmaW5lIEdQTUNfVElNRU9VVFNUQVJUVkFMVUVfREVDT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0RFQ09ERSg0LCBHUE1DX1RJTUVPVVRTVEFSVFZBTFVFX01BU0ssIHYpCisKKyNkZWZpbmUgR1BNQ19USU1FT1VURU5BQkxFX09GRgkJCQkJCQlBUk1fUkVHX1ZBTCgwLCAwKQorI2RlZmluZSBHUE1DX1RJTUVPVVRFTkFCTEVfT04JCQkJCQkJQVJNX1JFR19WQUwoMCwgMSkKKworLyoKKyAqIEdQTUMgR2xvYmFsIENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBHUE1DX1dBSVQzUElOUE9MQVJJVFlfQUNUSVZFX0xPVwkJCQlBUk1fUkVHX1ZBTCgxMSwgMCkKKyNkZWZpbmUgR1BNQ19XQUlUM1BJTlBPTEFSSVRZX0FDVElWRV9ISUdICQkJCUFSTV9SRUdfVkFMKDExLCAxKQorCisjZGVmaW5lIEdQTUNfV0FJVDJQSU5QT0xBUklUWV9BQ1RJVkVfTE9XCQkJCUFSTV9SRUdfVkFMKDEwLCAwKQorI2RlZmluZSBHUE1DX1dBSVQyUElOUE9MQVJJVFlfQUNUSVZFX0hJR0gJCQkJQVJNX1JFR19WQUwoMTAsIDEpCisKKyNkZWZpbmUgR1BNQ19XQUlUMVBJTlBPTEFSSVRZX0FDVElWRV9MT1cJCQkJQVJNX1JFR19WQUwoOSwgMCkKKyNkZWZpbmUgR1BNQ19XQUlUMVBJTlBPTEFSSVRZX0FDVElWRV9ISUdICQkJCUFSTV9SRUdfVkFMKDksIDEpCisKKyNkZWZpbmUgR1BNQ19XQUlUMFBJTlBPTEFSSVRZX0FDVElWRV9MT1cJCQkJQVJNX1JFR19WQUwoOCwgMCkKKyNkZWZpbmUgR1BNQ19XQUlUMFBJTlBPTEFSSVRZX0FDVElWRV9ISUdICQkJCUFSTV9SRUdfVkFMKDgsIDEpCisKKyNkZWZpbmUgR1BNQ19XUklURVBST1RFQ1RfTE9XCQkJCQkJCUFSTV9SRUdfVkFMKDQsIDApCisjZGVmaW5lIEdQTUNfV1JJVEVQUk9URUNUX0hJR0gJCQkJCQkJQVJNX1JFR19WQUwoNCwgMSkKKworI2RlZmluZSBHUE1DX0xJTUlURURBRERSRVNTX0RJU0FCTEVECQkJCQlBUk1fUkVHX1ZBTCgxLCAwKQorI2RlZmluZSBHUE1DX0xJTUlURURBRERSRVNTX0VOQUJMRUQJCQkJCQlBUk1fUkVHX1ZBTCgxLCAxKQorCisjZGVmaW5lIEdQTUNfTkFOREZPUkNFUE9TVEVEV1JJVEVfRElTQUJMRUQJCQkJQVJNX1JFR19WQUwoMCwgMCkKKyNkZWZpbmUgR1BNQ19OQU5ERk9SQ0VQT1NURURXUklURV9FTkFCTEVECQkJCUFSTV9SRUdfVkFMKDAsIDEpCisKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX01BU0sJCQkJCUFSTV9SRUdfVkFMKDgsIDB4RikKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX0VOQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9FTkNPREUoOCwgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX01BU0ssIHYpCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19ERUNPREUodikJCQkJQVJNX1JFR19WQUxfREVDT0RFKDgsIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU19NQVNLLCB2KQorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfMjU2X01CCQkJCQkgIDB4MAorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfMTI4X01CCQkJCQkgIDB4OAorI2RlZmluZSBHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfNjRfTUIJCQkJCSAgMHhDCisjZGVmaW5lIEdQTUNfQ09ORklHN19NQVNLQUREUkVTU18zMl9NQgkJCQkJICAweEUKKyNkZWZpbmUgR1BNQ19DT05GSUc3X01BU0tBRERSRVNTXzE2X01CCQkJCQkgIDB4RgorCisjZGVmaW5lIEdQTUNfQ09ORklHN19DU1ZBTElEX0RJU0FCTEVECQkJCQlBUk1fUkVHX1ZBTCg2LCAwKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfQ1NWQUxJRF9FTkFCTEVECQkJCQlBUk1fUkVHX1ZBTCg2LCAxKQorCisjZGVmaW5lIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19NQVNLCQkJCQlBUk1fUkVHX1ZBTCgwLCAweDNGKQorI2RlZmluZSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfRU5DT0RFKHYpCQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfTUFTSywgKCh2KSA+PiAyNCkpCisjZGVmaW5lIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19ERUNPREUodikJCQkJKEFSTV9SRUdfVkFMX0RFQ09ERSgwLCBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfTUFTSywgdikgPDwgMjQpCisKKworI2VuZGlmIC8qIF9PTUFQM19HUE1DX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvaTJjLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFmY2RhNWUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL2kyYy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfT01BUDM0WFhfSTJDX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9JMkNfSF8KKworLyogR2V0IHRoZSBpMmMgYmFzZSBhZGRyZXNzZXMgKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4KKworI2RlZmluZSBJMkNfREVGQVVMVF9CQVNFIEkyQ19CQVNFMQorCisjZGVmaW5lIEkyQ19SRVYgICAgICAgICAgICAgICAgICgweDAwKQorI2RlZmluZSBJMkNfSUUgICAgICAgICAgICAgICAgICAoMHgwNCkKKyNkZWZpbmUgSTJDX1NUQVQgICAgICAgICAgICAgICAgKDB4MDgpCisjZGVmaW5lIEkyQ19JViAgICAgICAgICAgICAgICAgICgweDBjKQorI2RlZmluZSBJMkNfQlVGICAgICAgICAgICAgICAgICAoMHgxNCkKKyNkZWZpbmUgSTJDX0NOVCAgICAgICAgICAgICAgICAgKDB4MTgpCisjZGVmaW5lIEkyQ19EQVRBICAgICAgICAgICAgICAgICgweDFjKQorI2RlZmluZSBJMkNfU1lTQyAgICAgICAgICAgICAgICAoMHgyMCkgCisjZGVmaW5lIEkyQ19DT04gICAgICAgICAgICAgICAgICgweDI0KQorI2RlZmluZSBJMkNfT0EgICAgICAgICAgICAgICAgICAoMHgyOCkKKyNkZWZpbmUgSTJDX1NBICAgICAgICAgICAgICAgICAgKDB4MmMpCisjZGVmaW5lIEkyQ19QU0MgICAgICAgICAgICAgICAgICgweDMwKQorI2RlZmluZSBJMkNfU0NMTCAgICAgICAgICAgICAgICAoMHgzNCkKKyNkZWZpbmUgSTJDX1NDTEggICAgICAgICAgICAgICAgKDB4MzgpCisjZGVmaW5lIEkyQ19TWVNURVNUICAgICAgICAgICAgICgweDNjKQorCisvKiBJMkMgbWFza3MgKi8KKworLyogSTJDIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKEkyQ19JRSk6ICovCisjZGVmaW5lIEkyQ19JRV9HQ19JRSAgICAoMSA8PCA1KQorI2RlZmluZSBJMkNfSUVfWFJEWV9JRSAgKDEgPDwgNCkgICAgICAgIC8qIFRyYW5zbWl0IGRhdGEgcmVhZHkgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJMkNfSUVfUlJEWV9JRSAgKDEgPDwgMykgICAgICAgIC8qIFJlY2VpdmUgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9BUkRZX0lFICAoMSA8PCAyKSAgICAgICAgLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0lFX05BQ0tfSUUgICgxIDw8IDEpICAgICAgICAvKiBObyBhY2tub3dsZWRnbWVudCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIEkyQ19JRV9BTF9JRSAgICAoMSA8PCAwKSAgICAgICAgLyogQXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgZW5hYmxlICovCisKKy8qIEkyQyBTdGF0dXMgUmVnaXN0ZXIgKEkyQ19TVEFUKTogKi8KKworI2RlZmluZSBJMkNfU1RBVF9TQkQgICAgKDEgPDwgMTUpICAgICAgIC8qIFNpbmdsZSBieXRlIGRhdGEgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQkIgICAgICgxIDw8IDEyKSAgICAgICAvKiBCdXMgYnVzeSAqLworI2RlZmluZSBJMkNfU1RBVF9ST1ZSICAgKDEgPDwgMTEpICAgICAgIC8qIFJlY2VpdmUgb3ZlcnJ1biAqLworI2RlZmluZSBJMkNfU1RBVF9YVURGICAgKDEgPDwgMTApICAgICAgIC8qIFRyYW5zbWl0IHVuZGVyZmxvdyAqLworI2RlZmluZSBJMkNfU1RBVF9BQVMgICAgKDEgPDwgOSkgICAgICAgIC8qIEFkZHJlc3MgYXMgc2xhdmUgKi8KKyNkZWZpbmUgSTJDX1NUQVRfR0MgICAgICgxIDw8IDUpCisjZGVmaW5lIEkyQ19TVEFUX1hSRFkgICAoMSA8PCA0KSAgICAgICAgLyogVHJhbnNtaXQgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9SUkRZICAgKDEgPDwgMykgICAgICAgIC8qIFJlY2VpdmUgZGF0YSByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9BUkRZICAgKDEgPDwgMikgICAgICAgIC8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSAqLworI2RlZmluZSBJMkNfU1RBVF9OQUNLICAgKDEgPDwgMSkgICAgICAgIC8qIE5vIGFja25vd2xlZGdtZW50IGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX1NUQVRfQUwgICAgICgxIDw8IDApICAgICAgICAvKiBBcmJpdHJhdGlvbiBsb3N0IGludGVycnVwdCBlbmFibGUgKi8KKworCisvKiBJMkMgSW50ZXJydXB0IENvZGUgUmVnaXN0ZXIgKEkyQ19JTlRDT0RFKTogKi8KKworI2RlZmluZSBJMkNfSU5UQ09ERV9NQVNLICAgICAgICA3CisjZGVmaW5lIEkyQ19JTlRDT0RFX05PTkUgICAgICAgIDAKKyNkZWZpbmUgSTJDX0lOVENPREVfQUwgICAgICAgICAgMSAgICAgICAvKiBBcmJpdHJhdGlvbiBsb3N0ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX05BSyAgICAgICAgIDIgICAgICAgLyogTm8gYWNrbm93bGVkZ2VtZW50L2dlbmVyYWwgY2FsbCAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9BUkRZICAgICAgICAzICAgICAgIC8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSAqLworI2RlZmluZSBJMkNfSU5UQ09ERV9SUkRZICAgICAgICA0ICAgICAgIC8qIFJjdiBkYXRhIHJlYWR5ICovCisjZGVmaW5lIEkyQ19JTlRDT0RFX1hSRFkgICAgICAgIDUgICAgICAgLyogWG1pdCBkYXRhIHJlYWR5ICovCisKKy8qIEkyQyBCdWZmZXIgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoSTJDX0JVRik6ICovCisKKyNkZWZpbmUgSTJDX0JVRl9SRE1BX0VOICAgICAgICAgKDEgPDwgMTUpICAgICAgIC8qIFJlY2VpdmUgRE1BIGNoYW5uZWwgZW5hYmxlICovCisjZGVmaW5lIEkyQ19CVUZfWERNQV9FTiAgICAgICAgICgxIDw8IDcpICAgICAgICAvKiBUcmFuc21pdCBETUEgY2hhbm5lbCBlbmFibGUgKi8KKworLyogSTJDIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKEkyQ19DT04pOiAqLworCisjZGVmaW5lIEkyQ19DT05fRU4gICAgICAoMSA8PCAxNSkgICAgICAgLyogSTJDIG1vZHVsZSBlbmFibGUgKi8KKyNkZWZpbmUgSTJDX0NPTl9CRSAgICAgICgxIDw8IDE0KSAgICAgICAvKiBCaWcgZW5kaWFuIG1vZGUgKi8KKyNkZWZpbmUgSTJDX0NPTl9TVEIgICAgICgxIDw8IDExKSAgICAgICAvKiBTdGFydCBieXRlIG1vZGUgKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fTVNUICAgICAoMSA8PCAxMCkgICAgICAgLyogTWFzdGVyL3NsYXZlIG1vZGUgKi8KKyNkZWZpbmUgSTJDX0NPTl9UUlggICAgICgxIDw8IDkpICAgICAgICAvKiBUcmFuc21pdHRlci9yZWNlaXZlciBtb2RlIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworI2RlZmluZSBJMkNfQ09OX1hBICAgICAgKDEgPDwgOCkgICAgICAgIC8qIEV4cGFuZCBhZGRyZXNzICovCisjZGVmaW5lIEkyQ19DT05fU1RQICAgICAoMSA8PCAxKSAgICAgICAgLyogU3RvcCBjb25kaXRpb24gKG1hc3RlciBtb2RlIG9ubHkpICovCisjZGVmaW5lIEkyQ19DT05fU1RUICAgICAoMSA8PCAwKSAgICAgICAgLyogU3RhcnQgY29uZGl0aW9uIChtYXN0ZXIgbW9kZSBvbmx5KSAqLworCisvKiBJMkMgU3lzdGVtIFRlc3QgUmVnaXN0ZXIgKEkyQ19TWVNURVNUKTogKi8KKworI2RlZmluZSBJMkNfU1lTVEVTVF9TVF9FTiAgICAgICAoMSA8PCAxNSkgICAgICAgLyogU3lzdGVtIHRlc3QgZW5hYmxlICovCisjZGVmaW5lIEkyQ19TWVNURVNUX0ZSRUUgICAgICAgICgxIDw8IDE0KSAgICAgICAvKiBGcmVlIHJ1bm5pbmcgbW9kZSAob24gYnJlYWtwb2ludCkgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfVE1PREVfTUFTSyAgKDMgPDwgMTIpICAgICAgIC8qIFRlc3QgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfVE1PREVfU0hJRlQgKDEyKSAgICAgICAgICAgIC8qIFRlc3QgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfU0NMX0kgICAgICAgKDEgPDwgMykgICAgICAgIC8qIFNDTCBsaW5lIHNlbnNlIGlucHV0IHZhbHVlICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1NDTF9PICAgICAgICgxIDw8IDIpICAgICAgICAvKiBTQ0wgbGluZSBkcml2ZSBvdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUgSTJDX1NZU1RFU1RfU0RBX0kgICAgICAgKDEgPDwgMSkgICAgICAgIC8qIFNEQSBsaW5lIHNlbnNlIGlucHV0IHZhbHVlICovCisjZGVmaW5lIEkyQ19TWVNURVNUX1NEQV9PICAgICAgICgxIDw8IDApICAgICAgICAvKiBTREEgbGluZSBkcml2ZSBvdXRwdXQgdmFsdWUgKi8KKworI2RlZmluZSBJMkNfU0NMTF9TQ0xMICAgICAgICAoMCkKKyNkZWZpbmUgSTJDX1NDTExfU0NMTF9NICAgICAgKDB4RkYpCisjZGVmaW5lIEkyQ19TQ0xMX0hTU0NMTCAgICAgICg4KQorI2RlZmluZSBJMkNfU0NMSF9IU1NDTExfTSAgICAoMHhGRikKKyNkZWZpbmUgSTJDX1NDTEhfU0NMSCAgICAgICAgKDApCisjZGVmaW5lIEkyQ19TQ0xIX1NDTEhfTSAgICAgICgweEZGKQorI2RlZmluZSBJMkNfU0NMSF9IU1NDTEggICAgICAoOCkKKyNkZWZpbmUgSTJDX1NDTEhfSFNTQ0xIX00gICAgKDB4RkYpCisKKyNkZWZpbmUgT01BUF9JMkNfU1RBTkRBUkQgICAgICAgICAgMTAwCisjZGVmaW5lIE9NQVBfSTJDX0ZBU1RfTU9ERSAgICAgICAgIDQwMAorI2RlZmluZSBPTUFQX0kyQ19ISUdIX1NQRUVEICAgICAgICAzNDAwCisKKyNkZWZpbmUgU1lTVEVNX0NMT0NLXzEyICAgICAgIDEyMDAwCisjZGVmaW5lIFNZU1RFTV9DTE9DS18xMyAgICAgICAxMzAwMAorI2RlZmluZSBTWVNURU1fQ0xPQ0tfMTkyICAgICAgMTkyMDAKKyNkZWZpbmUgU1lTVEVNX0NMT0NLXzk2ICAgICAgIDk2MDAwCisKKyNkZWZpbmUgSTJDX0lQX0NMSyBTWVNURU1fQ0xPQ0tfOTYKKyNkZWZpbmUgSTJDX1BTQ19NQVggICAgICAgICAgKDB4MGYpCisjZGVmaW5lIEkyQ19QU0NfTUlOICAgICAgICAgICgweDAwKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbWVtLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGJjZTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL21lbS5oCkBAIC0wLDAgKzEsNTg2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDM0WFhfTUVNX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9NRU1fSF8KKworI2RlZmluZSBTRFJDX0NTMF9PU0VUICAgIDB4MAorI2RlZmluZSBTRFJDX0NTMV9PU0VUICAgIDB4MzAgIC8qIG1pcnJvciBDUzEgcmVncyBhcHBlYXIgb2Zmc2V0IDB4MzAgZnJvbSBDUzAgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiBlbnVtIHsKKwlTVEFDS0VECQk9IDAsCisJSVBfRERSCQk9IDEsCisJQ09NQk9fRERSCT0gMiwKKwlJUF9TRFIJIAk9IDMsCit9IG1lbV90OworCisKKy8qIE1lbW9yeSB0aGF0IGNhbiBiZSBjb25uZWN0ZWQgdG8gR1BNQyAqLworI2RlZmluZSBHUE1DX05PUiAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BNQ19OQU5EICAgICAgICAgICAxCisjZGVmaW5lIEdQTUNfTURPQyAgICAgICAgICAgMgorI2RlZmluZSBHUE1DX09ORU5BTkQgICAgICAgIDMKKyNkZWZpbmUgTU1DX05BTkQJCQk0CisjZGVmaW5lIE1NQ19PTkVOQU5ECQkJNQorI2RlZmluZSBVU0JfUEVSSVBIRVJBTCAgICAgIDYKKworI2VuZGlmCisKKy8qIHNldCB0aGUgMzQzeC1TRFJDIGluY29taW5nIGFkZHJlc3MgY29udmVudGlvbiAqLworI2lmIGRlZmluZWQoU0RSQ19CX1JfQykKKyNkZWZpbmUgQl9BTEwJKDAgPDwgNikJLyogYmFuay1yb3ctY29sdW1uICovCisjZWxpZiBkZWZpbmVkKFNEUkNfQjFfUl9CMF9DKQorI2RlZmluZSBCX0FMTAkoMSA8PCA2KQkvKiBiYW5rMS1yb3ctYmFuazAtY29sdW1uICovCisjZWxpZiBkZWZpbmVkKFNEUkNfUl9CX0MpCisjZGVmaW5lIEJfQUxMCSgyIDw8IDYpCS8qIHJvdy1iYW5rLWNvbHVtbiAqLworI2VuZGlmCisKKy8qIEZ1dHVyZSBtZW1vcnkgY29tYmluYXRpb25zIGJhc2VkIG9uIHBhc3QgKi8KKyNkZWZpbmUgU0RQX1NEUkNfTURDRkdfTU9OT19ERFIgICAgMHgwCisjZGVmaW5lIFNEUF9DT01CT19NRENGR18wX0REUiAgICAgIDB4MAorI2RlZmluZSBTRFBfU0RSQ19NRENGR18wX1NEUiAgICAgICAweDAKKworLyogU2xvd2VyIGZ1bGwgZnJlcXVlbmN5IHJhbmdlIGRlZmF1bHQgdGltaW5ncyBmb3IgeDMyIG9wZXJhdGlvbiovCisjZGVmaW5lIFNEUF9TRFJDX1NIQVJJTkcJCTB4MDAwMDAxMDAKKyNkZWZpbmUgU0RQX1NEUkNfTVJfMF9TRFIJCTB4MDAwMDAwMzEKKworI2lmZGVmIENPTkZJR18zNDMwWkVCVQorI2RlZmluZSBTRFBfU0RSQ19NRENGR18wX0REUgkoMHgwMjU4MjAxOXxCX0FMTCkgLyogSW5maW4gZGRyIG1vZHVsZSAqLworI2Vsc2UKKyNkZWZpbmUgU0RQX1NEUkNfTURDRkdfMF9ERFIJKDB4MDI1ODQwMTl8Ql9BTEwpIC8qIEluZmluIGRkciBtb2R1bGUgKi8KKyNlbmRpZgorCisjZGVmaW5lIFNEUF9TRFJDX01SXzBfRERSCQkweDAwMDAwMDMyCisKKy8qIERpYWJsaW5nIHBvd2VyIGRvd24gbW9kZSB1c2luZyBDS0UgcGluICovCisjZGVmaW5lIFNEUF9TRFJDX1BPV0VSX1BPUCAgICAgIDB4MDAwMDAwODEKKworLyogb3B0aW1pemVkIHRpbWluZ3MgZ29vZCBmb3IgY3VycmVudCBzaGlwcGluZyBwYXJ0cyAqLworI2RlZmluZSBTRFBfMzQzMF9TRFJDX1JGUl9DVFJMXzEwME1IeiAgIDB4MDAwMmRhMDEKKyNkZWZpbmUgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xMzNNSHogICAweDAwMDNkZTAxIC8qIDcuOHVzLzcuNW5zIC0gNTA9MHgzZGUgKi8KKyNkZWZpbmUgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xNjVNSHogICAweDAwMDRlMjAxIC8qIDcuOHVzLzZucyAtIDUwPTB4NGUyICovCisKKyNkZWZpbmUgRExMX09GRlNFVCAgICAgICAgICAgICAgMAorI2RlZmluZSBETExfV1JJVEVERFJDTEtYMkRJUyAgICAxCisjZGVmaW5lIERMTF9FTkFETEwgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRExMX0xPQ0tETEwgICAgICAgICAgICAgMAorI2RlZmluZSBETExfRExMUEhBU0VfNzIgICAgICAgICAwCisjZGVmaW5lIERMTF9ETExQSEFTRV85MCAgICAgICAgIDEKKworLy8gcmt3IC0gbmVlZCB0byBmaW5kIG9mIDkwLzcyIGRlZ3JlZSByZWNvbW1lbmRhdGlvbiBmb3Igc3BlZWQgbGlrZSBiZWZvcmUuCisjZGVmaW5lIFNEUF9TRFJDX0RMTEFCX0NUUkwgKChETExfRU5BRExMIDw8IDMpIHwgXAorICAgIChETExfTE9DS0RMTCA8PCAyKSB8IChETExfRExMUEhBU0VfOTAgPDwgMSkpCisKKy8qIEluZmluZW9uIHBhcnQgb2YgMzQzMFNEUCAoMTMzTUh6IG9wdGltaXplZCkgfiA3LjVucworICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNy41ICsgMjIuNS83LjUgPSAyICsgMyA9IDUKKyAqCVREUEwgPSAxNS83LjUJPSAyCisgKglUUlJEID0gMTUvMi41CT0gMgorICoJVFJDRCA9IDIyLjUvNy41CT0gMworICoJVFJQID0gMjIuNS83LjUJPSAzCisgKglUUkFTID0gNDUvNy41CT0gNgorICoJVFJDID0gNjUvNy41CT0gOC42LT45CisgKglUUkZDID0gNzUvNy41CT0gMTAKKyAqICAgQUNUSU1CCisgKglUQ0tFID0gMgorICoJWFNSID0gMTIwLzcuNSA9IDE2CisgKi8KKyNkZWZpbmUgSU5GSU5FT05fVERBTF8xMzMgICA1CisjZGVmaW5lIElORklORU9OX1REUExfMTMzICAgMgorI2RlZmluZSBJTkZJTkVPTl9UUlJEXzEzMyAgIDIKKyNkZWZpbmUgSU5GSU5FT05fVFJDRF8xMzMgICAzCisjZGVmaW5lIElORklORU9OX1RSUF8xMzMgICAgMworI2RlZmluZSBJTkZJTkVPTl9UUkFTXzEzMyAgIDYKKyNkZWZpbmUgSU5GSU5FT05fVFJDXzEzMyAgICA5CisjZGVmaW5lIElORklORU9OX1RSRkNfMTMzICAxMAorI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQV8xMzMgKChJTkZJTkVPTl9UUkZDXzEzMyA8PCAyNykgfCAoSU5GSU5FT05fVFJDXzEzMyA8PCAyMikgfCAoSU5GSU5FT05fVFJBU18xMzMgPDwgMTgpIFwKKwkJfChJTkZJTkVPTl9UUlBfMTMzIDw8IDE1KSB8IChJTkZJTkVPTl9UUkNEXzEzMyA8PCAxMikgfChJTkZJTkVPTl9UUlJEXzEzMyA8PCA5KSB8KElORklORU9OX1REUExfMTMzIDw8IDYpIFwKKwkJfCAoSU5GSU5FT05fVERBTF8xMzMpKQorCisjZGVmaW5lIElORklORU9OX1RXVFJfMTMzICAgMQorI2RlZmluZSBJTkZJTkVPTl9UQ0tFXzEzMyAgIDIKKyNkZWZpbmUgSU5GSU5FT05fVFhQXzEzMyAgICAyCisjZGVmaW5lIElORklORU9OX1hTUl8xMzMgICAxNgorI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQl8xMzMgKChJTkZJTkVPTl9UQ0tFXzEzMyA8PCAxMikgfCAoSU5GSU5FT05fWFNSXzEzMyA8PCAwKSkgfCBcCisJCQkJKElORklORU9OX1RYUF8xMzMgPDwgOCkgfCAoSU5GSU5FT05fVFdUUl8xMzMgPDwgMTYpCisKKyNkZWZpbmUgSU5GSU5FT05fVl9BQ1RJTUFfMTAwIElORklORU9OX1ZfQUNUSU1BXzEzMworI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQl8xMDAgSU5GSU5FT05fVl9BQ1RJTUJfMTMzCisKKworLyogSW5maW5lb24gcGFydCBvZiAzNDMwU0RQICgxNjVNSHogb3B0aW1pemVkKSA2LjA2bnMKKyAqICAgQUNUSU1BCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS82ICsgMTgvNiA9IDIuNSArIDMgPSA1LjUgLT4gNgorICoJVERQTCAoVHdyKSA9IDE1LzYJPSAyLjUgLT4gMworICoJVFJSRCA9IDEyLzYJPSAyCisgKglUUkNEID0gMTgvNgk9IDMKKyAqCVRSUCA9IDE4LzYJPSAzCisgKglUUkFTID0gNDIvNgk9IDcKKyAqCVRSQyA9IDYwLzYJPSAxMAorICoJVFJGQyA9IDcyLzYJPSAxMgorICogICBBQ1RJTUIKKyAqCVRDS0UgPSAyCisgKglYU1IgPSAxMjAvNiA9IDIwCisgKi8KKyNkZWZpbmUgSU5GSU5FT05fVERBTF8xNjUgICA2CisjZGVmaW5lIElORklORU9OX1REUExfMTY1ICAgMworI2RlZmluZSBJTkZJTkVPTl9UUlJEXzE2NSAgIDIKKyNkZWZpbmUgSU5GSU5FT05fVFJDRF8xNjUgICAzCisjZGVmaW5lIElORklORU9OX1RSUF8xNjUgICAgMworI2RlZmluZSBJTkZJTkVPTl9UUkFTXzE2NSAgIDcKKyNkZWZpbmUgSU5GSU5FT05fVFJDXzE2NSAgIDEwCisjZGVmaW5lIElORklORU9OX1RSRkNfMTY1ICAxMgorI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQV8xNjUgKChJTkZJTkVPTl9UUkZDXzE2NSA8PCAyNykgfCAoSU5GSU5FT05fVFJDXzE2NSA8PCAyMikgfCAoSU5GSU5FT05fVFJBU18xNjUgPDwgMTgpIFwKKwkJfCAoSU5GSU5FT05fVFJQXzE2NSA8PCAxNSkgfCAoSU5GSU5FT05fVFJDRF8xNjUgPDwgMTIpIHwoSU5GSU5FT05fVFJSRF8xNjUgPDwgOSkgfCBcCisJCShJTkZJTkVPTl9URFBMXzE2NSA8PCA2KSB8IChJTkZJTkVPTl9UREFMXzE2NSkpCisKKyNkZWZpbmUgSU5GSU5FT05fVFdUUl8xNjUgICAxCisjZGVmaW5lIElORklORU9OX1RDS0VfMTY1ICAgMgorI2RlZmluZSBJTkZJTkVPTl9UWFBfMTY1ICAgIDIKKyNkZWZpbmUgSU5GSU5FT05fWFNSXzE2NSAgICAyMAorI2RlZmluZSBJTkZJTkVPTl9WX0FDVElNQl8xNjUgKChJTkZJTkVPTl9UQ0tFXzE2NSA8PCAxMikgfCAoSU5GSU5FT05fWFNSXzE2NSA8PCAwKSkgfCBcCisJCQkJKElORklORU9OX1RYUF8xNjUgPDwgOCkgfCAoSU5GSU5FT05fVFdUUl8xNjUgPDwgMTYpCisKKy8qIE1pY3JvbiBwYXJ0IG9mIDM0MzAgRVZNICgxMzNNSHogb3B0aW1pemVkKSB+IDcuNW5zCisgKglUREFMID0gVHdyL1RjayArIFRycC90Y2sgPSAxNS83LjUgKyAyMi41LzcuNSA9IDIgKyAzID0gNQorICoJVERQTCA9ICAxNS83LjUgICA9IDIKKyAqCVRSUkQgPSAgMTUvNy41ICAgPSAyCisgKglUUkNEID0gIDIyLjUvNy41ID0gMworICoJVFJQICA9ICAyMi41LzcuNSA9IDMKKyAqCVRSQVMgPSAgNDUvNy41ICAgPSA2CisgKglUUkMgID0gIDc1LzcuNSAgID0gMTAKKyAqCVRSRkMgPSAgMTI1LzcuNSAgPSAxNi42LT4xNworICogICBBQ1RJTUIKKyAqCVRXVFIgPSAgMQorICoJVENLRSA9ICAxCisgKglUWFNSID0gIDEzOC83LjUgID0gMTguMy0+MTkKKyAqCVRYUCAgPSAgMjUvNy41ICAgPSAzLjMtPjQKKyAqLworI2RlZmluZSBNSUNST05fVERBTF8xMzMgICA1CisjZGVmaW5lIE1JQ1JPTl9URFBMXzEzMyAgIDIKKyNkZWZpbmUgTUlDUk9OX1RSUkRfMTMzICAgMgorI2RlZmluZSBNSUNST05fVFJDRF8xMzMgICAzCisjZGVmaW5lIE1JQ1JPTl9UUlBfMTMzICAgIDMKKyNkZWZpbmUgTUlDUk9OX1RSQVNfMTMzICAgNgorI2RlZmluZSBNSUNST05fVFJDXzEzMyAgICAxMAorI2RlZmluZSBNSUNST05fVFJGQ18xMzMgICAxNworI2RlZmluZSBNSUNST05fVl9BQ1RJTUFfMTMzICgoTUlDUk9OX1RSRkNfMTMzIDw8IDI3KSB8IChNSUNST05fVFJDXzEzMyA8PCAyMikgfCAoTUlDUk9OX1RSQVNfMTMzIDw8IDE4KSBcCisJCXwoTUlDUk9OX1RSUF8xMzMgPDwgMTUpIHwgKE1JQ1JPTl9UUkNEXzEzMyA8PCAxMikgfChNSUNST05fVFJSRF8xMzMgPDwgOSkgfChNSUNST05fVERQTF8xMzMgPDwgNikgXAorCQl8IChNSUNST05fVERBTF8xMzMpKQorCisjZGVmaW5lIE1JQ1JPTl9UV1RSXzEzMyAgIDEKKyNkZWZpbmUgTUlDUk9OX1RDS0VfMTMzICAgMQorI2RlZmluZSBNSUNST05fVFhTUl8xMzMgICAxOQorI2RlZmluZSBNSUNST05fVFhQXzEzMyAgICA0CisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQl8xMzMgKChNSUNST05fVFdUUl8xMzMgPDwgMTYpIHwgKE1JQ1JPTl9UQ0tFXzEzMyA8PCAxMikgfCAoTUlDUk9OX1RYUF8xMzMgPDwgOCkgXAorCQl8IChNSUNST05fVFhTUl8xMzMgPDwgMCkpCisKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1BXzEwMCBNSUNST05fVl9BQ1RJTUFfMTMzCisjZGVmaW5lIE1JQ1JPTl9WX0FDVElNQl8xMDAgTUlDUk9OX1ZfQUNUSU1CXzEzMworCisvKiBNaWNyb24gcGFydCBvZiAzNDMwIEVWTSAoMTY1TUh6IG9wdGltaXplZCkgNi4wNm5zCisgKiAgIEFDVElNQQorICoJVERBTCA9IFR3ci9UY2sgKyBUcnAvdGNrID0gMTUvNiArIDE4IC82ID0gMi41ICsgMyA9IDUuNSAtPiA2CisgKglURFBMIChUd3IpID0gMTUvNgk9IDIuNSAtPiAzCisgKglUUlJEID0gMTIvNgk9IDIKKyAqCVRSQ0QgPSAxOC82ID0gMworICoJVFJQID0gMTgvNgk9IDMKKyAqCVRSQVMgPSA0Mi82CT0gNworICoJVFJDID0gNjAvNgk9IDEwCisgKglUUkZDID0gMTI1LzYJPSAyMQorICogICBBQ1RJTUIKKyAqCVRXVFIgPSAgMQorICoJVENLRSA9ICAxCisgKglUWFNSID0gIDEzOC82ICA9IDIzCisgKglUWFAgID0gIDI1LzYgICA9IDQuMSB+NQorICovCisjZGVmaW5lIE1JQ1JPTl9UREFMXzE2NSAgIDYKKyNkZWZpbmUgTUlDUk9OX1REUExfMTY1ICAgMworI2RlZmluZSBNSUNST05fVFJSRF8xNjUgICAyCisjZGVmaW5lIE1JQ1JPTl9UUkNEXzE2NSAgIDMKKyNkZWZpbmUgTUlDUk9OX1RSUF8xNjUgICAgMworI2RlZmluZSBNSUNST05fVFJBU18xNjUgICA3CisjZGVmaW5lIE1JQ1JPTl9UUkNfMTY1ICAgMTAKKyNkZWZpbmUgTUlDUk9OX1RSRkNfMTY1ICAyMQorI2RlZmluZSBNSUNST05fVl9BQ1RJTUFfMTY1ICgoTUlDUk9OX1RSRkNfMTY1IDw8IDI3KSB8IChNSUNST05fVFJDXzE2NSA8PCAyMikgfCAoTUlDUk9OX1RSQVNfMTY1IDw8IDE4KSBcCisJCXwgKE1JQ1JPTl9UUlBfMTY1IDw8IDE1KSB8IChNSUNST05fVFJDRF8xNjUgPDwgMTIpIHwoTUlDUk9OX1RSUkRfMTY1IDw8IDkpIHwgXAorCQkoTUlDUk9OX1REUExfMTY1IDw8IDYpIHwgKE1JQ1JPTl9UREFMXzE2NSkpCisKKyNkZWZpbmUgTUlDUk9OX1RXVFJfMTY1ICAgMQorI2RlZmluZSBNSUNST05fVENLRV8xNjUgICAxCisjZGVmaW5lIE1JQ1JPTl9UWFBfMTY1ICAgIDUKKyNkZWZpbmUgTUlDUk9OX1hTUl8xNjUgICAgMjMKKyNkZWZpbmUgTUlDUk9OX1ZfQUNUSU1CXzE2NSAoKE1JQ1JPTl9UQ0tFXzE2NSA8PCAxMikgfCAoTUlDUk9OX1hTUl8xNjUgPDwgMCkpIHwgXAorCQkJCShNSUNST05fVFhQXzE2NSA8PCA4KSB8IChNSUNST05fVFdUUl8xNjUgPDwgMTYpCisKKworCisvKiBIeW5peCBwYXJ0IG9mIEFNL0RNMzd4RVZNICgyMDBNSHogb3B0aW1pemVkKQorICogICBBQ1RJTUEKKyAqCVREQUwJCT0gNgorICoJVERQTCAoVHdyKQk9IDMKKyAqCVRSUkQJCT0gMgorICoJVFJDRAkJPSA0CisgKglUUlAJCT0gMworICoJVFJBUwkJPSA4CisgKglUUkMJCT0gMTEKKyAqCVRSRkMJCT0gMTgKKyAqICAgQUNUSU1CCisgKglUV1RSCQk9IDIKKyAqCVRDS0UJCT0gMQorICoJVFhQCQk9IDEKKyAqCVRYU1IJCT0gMjgKKyAqLworI2RlZmluZSBIWU5JWF9UREFMXzIwMAk2CisjZGVmaW5lIEhZTklYX1REUExfMjAwCTMKKyNkZWZpbmUgSFlOSVhfVFJSRF8yMDAJMgorI2RlZmluZSBIWU5JWF9UUkNEXzIwMAk0CisjZGVmaW5lIEhZTklYX1RSUF8yMDAJCTMKKyNkZWZpbmUgSFlOSVhfVFJBU18yMDAJOAorI2RlZmluZSBIWU5JWF9UUkNfMjAwCQkxMQorI2RlZmluZSBIWU5JWF9UUkZDXzIwMAkxOAorI2RlZmluZSBIWU5JWF9WX0FDVElNQV8yMDAJKChIWU5JWF9UUkZDXzIwMCA8PCAyNykgfCAoSFlOSVhfVFJDXzIwMCA8PCAyMikgfCBcCisJCQkoSFlOSVhfVFJBU18yMDAgPDwgMTgpIHwgKEhZTklYX1RSUF8yMDAgPDwgMTUpIHwgIFwKKwkJCShIWU5JWF9UUkNEXzIwMCA8PCAxMikgfCAoSFlOSVhfVFJSRF8yMDAgPDwgOSkgfCAgXAorCQkJKEhZTklYX1REUExfMjAwIDw8IDYpIHwgKEhZTklYX1REQUxfMjAwKSkKKworI2RlZmluZSBIWU5JWF9UV1RSXzIwMAkyCisjZGVmaW5lIEhZTklYX1RDS0VfMjAwCTEKKyNkZWZpbmUgSFlOSVhfVFhQXzIwMAkJMQorI2RlZmluZSBIWU5JWF9YU1JfMjAwCQkyOAorI2RlZmluZSBIWU5JWF9WX0FDVElNQl8yMDAJKCgoSFlOSVhfVENLRV8yMDAgPDwgMTIpIHwgKEhZTklYX1hTUl8yMDAgPDwgMCkpIHwJXAorCQkJKEhZTklYX1RYUF8yMDAgPDwgOCkgfCAoSFlOSVhfVFdUUl8yMDAgPDwgMTYpKQorCisjZGVmaW5lIEhZTklYX1NEUkNfQUNUSU1fQ1RSTEFfMAlIWU5JWF9WX0FDVElNQV8yMDAKKyNkZWZpbmUgSFlOSVhfU0RSQ19BQ1RJTV9DVFJMQl8wCUhZTklYX1ZfQUNUSU1CXzIwMAorCisKKworLyogTmV3IGFuZCBjb21wYXRhYmlsaXR5IHNwZWVkIGRlZmluZXMgKi8KKyNpZiBkZWZpbmVkKFBSQ01fQ0xLX0NGRzJfMjAwTUhaKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHX0lJKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHXzVCKQorIyBkZWZpbmUgTDNfMTAwTUhaICAgLyogVXNlIHdpdGggPD0gMTAwTUh6IFNEUkFNICovCisjZWxpZiBkZWZpbmVkIChQUkNNX0NMS19DRkcyXzI2Nk1IWikgfHwgZGVmaW5lZChQUkNNX0NPTkZJR19JSUkpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfNUEpCisjIGRlZmluZSBMM18xMzNNSFogICAgLyogVXNlIHdpdGggPD0gMTMzTUh6IFNEUkFNKi8KKyNlbGlmICBkZWZpbmVkKFBSQ01fQ0xLX0NGRzJfMzMyTUhaKSB8fCBkZWZpbmVkKFBSQ01fQ09ORklHX0kpIHx8IGRlZmluZWQoUFJDTV9DT05GSUdfMikKKyMgZGVmaW5lIEwzXzE2NU1IWiAgICAvKiBVc2Ugd2l0aCA8PSAxNjVNSHogU0RSQU0gKEwzPTE2NiBvbiAzNDMwKSAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEwzXzEwME1IWikKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxBXzAgICAgIE1JQ1JPTl9WX0FDVElNQV8xMDAKKyMgZGVmaW5lIE1JQ1JPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIE1JQ1JPTl9WX0FDVElNQl8xMDAKKyNlbGlmIGRlZmluZWQoTDNfMTMzTUhaKQorIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgTUlDUk9OX1ZfQUNUSU1BXzEzMworIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgTUlDUk9OX1ZfQUNUSU1CXzEzMworI2VsaWYgIGRlZmluZWQoTDNfMTY1TUhaKQorIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgTUlDUk9OX1ZfQUNUSU1BXzE2NQorIyBkZWZpbmUgTUlDUk9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgTUlDUk9OX1ZfQUNUSU1CXzE2NQorI2VuZGlmCisKKworI2lmIGRlZmluZWQoTDNfMTAwTUhaKQorIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBJTkZJTkVPTl9WX0FDVElNQV8xMDAKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUJfMTAwCisjZWxpZiBkZWZpbmVkKEwzXzEzM01IWikKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEFfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUFfMTMzCisjIGRlZmluZSBJTkZJTkVPTl9TRFJDX0FDVElNX0NUUkxCXzAgICAgIElORklORU9OX1ZfQUNUSU1CXzEzMworI2VsaWYgIGRlZmluZWQoTDNfMTY1TUhaKQorIyBkZWZpbmUgSU5GSU5FT05fU0RSQ19BQ1RJTV9DVFJMQV8wICAgICBJTkZJTkVPTl9WX0FDVElNQV8xNjUKKyMgZGVmaW5lIElORklORU9OX1NEUkNfQUNUSU1fQ1RSTEJfMCAgICAgSU5GSU5FT05fVl9BQ1RJTUJfMTY1CisjZW5kaWYKKworI2lmIGRlZmluZWQoTDNfMTAwTUhaKQorIyBkZWZpbmUgU0RQX1NEUkNfUkZSX0NUUkwgICAgICAgICAgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xMDBNSHoKKyNlbGlmIGRlZmluZWQoTDNfMTMzTUhaKQorIyBkZWZpbmUgU0RQX1NEUkNfUkZSX0NUUkwgICAgICAgICAgU0RQXzM0MzBfU0RSQ19SRlJfQ1RSTF8xMzNNSHoKKyNlbGlmICBkZWZpbmVkKEwzXzE2NU1IWikKKyMgZGVmaW5lIFNEUF9TRFJDX1JGUl9DVFJMICAgICAgICAgIFNEUF8zNDMwX1NEUkNfUkZSX0NUUkxfMTY1TUh6CisjZW5kaWYKKworLyoKKyAqIEdQTUMgc2V0dGluZ3MgLQorICogRGVmaW5pdGlvbnMgaXMgYXMgcGVyIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisgKiAjIGRlZmluZSA8UEFSVD5fR1BNQ19DT05GSUc8eD4gPHZhbHVlPgorICogV2hlcmU6CisgKiBQQVJUIGlzIHRoZSBwYXJ0IG5hbWUgZS5nLiBTVE5PUiAtIEludGVsIFN0cmF0YSBGbGFzaAorICogeCBpcyBHUE1DIGNvbmZpZyByZWdpc3RlcnMgZnJvbSAxIHRvIDYgKHRoZXJlIHdpbGwgYmUgNiBtYWNyb3MpCisgKiBWYWx1ZSBpcyBjb3JyZXNwb25kaW5nIHZhbHVlCisgKgorICogRm9yIGV2ZXJ5IHZhbGlkIFBSQ00gY29uZmlndXJhdGlvbiB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZGVmaW5pdGlvbiBvZgorICogdGhlIHNhbWUuIGlmIHZhbHVlcyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGJvYXJkLCB0aGlzIGRlZmluaXRpb24gd2lsbCBiZQorICogcHJlc2VudCBpbiB0aGlzIGZpbGUgaWYgdmFsdWVzIGFyZSBkZXBlbmRlbnQgb24gdGhlIGJvYXJkLCB0aGVuIHRoaXMgc2hvdWxkCisgKiBnbyBpbnRvIGNvcnJlc3BvbmRpbmcgbWVtLWJvYXJkTmFtZS5oIGZpbGUKKyAqCisgKiBDdXJyZW50bHkgdmFsaWQgcGFydCBOYW1lcyBhcmUgKFBBUlQpOgorICogU1ROT1IgLSBJbnRlbCBTdHJhdGEgRmxhc2gKKyAqIFNNTkFORCAtIFNhbXN1bmcgTkFORAorICogTV9OQU5EIC0gTWljcm9uIExhcmdlIHBhZ2UgeDE2IE5BTkQKKyAqIE1QREIgLSBINCBNUERCIGJvYXJkCisgKiBTQk5PUiAtIFNpYmxleSBOT1IKKyAqIE9OTkFORCAtIFNhbXN1bmcgT25lIE5BTkQKKyAqCisgKiBpbmNsdWRlL2NvbmZpZ3MvZmlsZS5oIGNvbnRhaW5zIHRoZSBkZWZuIC0gZm9yIGFsbCBDUyB3ZSBhcmUgaW50ZXJlc3RlZAorICogI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTeCBQQVJUCisgKiAjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1N4X1NJWkUgU2l6ZQorICogI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTeF9NQVAgTWFwCisgKiBXaGVyZToKKyAqIHggLSBDUyBudW1iZXIKKyAqIFBBUlQgLSBQYXJ0IE5hbWUgYXMgZGVmaW5lZCBhYm92ZQorICogU0laRSAtIGhvdyBiaWcgaXMgdGhlIG1hcHBpbmcgdG8gYmUKKyAqICAgR1BNQ19TSVpFXzEyOE0gLSAweDgKKyAqICAgR1BNQ19TSVpFXzY0TSAgLSAweEMKKyAqICAgR1BNQ19TSVpFXzMyTSAgLSAweEUKKyAqICAgR1BNQ19TSVpFXzE2TSAgLSAweEYKKyAqIE1BUCAgLSBNYXAgdGhpcyBDUyB0byB3aGljaCBhZGRyZXNzKEdQTUMgYWRkcmVzcyBzcGFjZSktIEFic29sdXRlIGFkZHJlc3MKKyAqICAgPj4yNCBiZWZvcmUgYmVpbmcgdXNlZC4KKyAqLworI2RlZmluZSBHUE1DX1NJWkVfMTI4TSAgMHg4CisjZGVmaW5lIEdQTUNfU0laRV82NE0gICAweEMKKyNkZWZpbmUgR1BNQ19TSVpFXzMyTSAgIDB4RQorI2RlZmluZSBHUE1DX1NJWkVfMTZNICAgMHhGCisKKyNpZiBkZWZpbmVkKEwzXzEwME1IWikKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzEgMHgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMEE4MAorCisjaWYgZGVmaW5lZCAoQ09ORklHX09NQVAzNFhYKQorCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgMHgwMDA5MDkwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyAweDAwMDkwOTAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IDB4MDcwMTA3MDIKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgMHgwMTA1MDkwOAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiAweDFGMEYwMzgwCisKKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyNlbHNlCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDA4MDAKKyNlbmRpZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgMHgwNjAwMDYwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSAweDAwMDcwODA4CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAzY2YKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMDg0OAorCisjZW5kaWYKKworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDBmMGYwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDUwNTAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MEMwNjBDMDYKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAgIC8qIDA/ICovCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAgMHgwMDFGMUYwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzMgICAweDAwMDgwODAyCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgIDB4MUMwOTFDMDkKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAgMHgwMzFBMUYxRgorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzYgICAweDAwMDAwM0MyCisjZW5kaWYKKworI2lmIGRlZmluZWQoTDNfMTMzTUhaKQorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAwODAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcyIDB4MDAxNDE0MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzMgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNCAweDBGMDEwRjAxCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwQzE0MTQKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMEE4MAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNyAweDAwMDAwQzQ0CisKKyNpZiBkZWZpbmVkIChDT05GSUdfT01BUDM0WFgpCisKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiBTTU5BTkRfR1BNQ19DT05GSUcyCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIFNNTkFORF9HUE1DX0NPTkZJRzMKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgU01OQU5EX0dQTUNfQ09ORklHNAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSBTTU5BTkRfR1BNQ19DT05GSUc1CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IFNNTkFORF9HUE1DX0NPTkZJRzYKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzcgU01OQU5EX0dQTUNfQ09ORklHNworCisjZWxpZiBkZWZpbmVkIChDT05GSUdfQU0zNTE3RVZNKSB8fCBkZWZpbmVkIChDT05GSUdfQU0zNTE3VEVCKQorCisjaWZkZWYgTkFORF8xNkJJVAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjZWxzZQorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAwODAwCisjZW5kaWYKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzIgMHgwMDA4MDgwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMyAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc0IDB4MDYwMDA2MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzUgMHgwMDA3MDgwOAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNiAweDAwMDAwM2NmCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDA4NDgKKworI2VuZGlmCisKKworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcxICAweDEyMDMKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHMiAgMHgwMDE1MTUwMQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUczICAweDAwMDYwNjAyCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzQgIDB4MTAwODEwMDgKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc2ICAweDAwMDAwNGM0CisKKyMgZGVmaW5lIFNJQk5PUl9HUE1DX0NPTkZJRzEgIDB4MTIwMAorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMiAgMHgwMDFmMWYwMAorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNCAgMHgxQzA5MUMwOQorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNSAgMHgwMTEzMUYxRgorIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHNiAgMHgwMDAwMDNDMgorCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMSAgMHgwMDAxMTAwMAorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzIgIDB4MDAxZjFmMDEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUczICAweDAwMDgwODAzCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNCAgMHgxQzA5MUMwOQorIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzUgIDB4MDQxZjFGMUYKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc2ICAweDAwMDAwNEM0CisKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMSAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzIgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUczICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNCAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzUgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc2ICAweDAKKworIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzEgMHgwMDAwMTIwMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzIgMHgwMDBjMGMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzMgMHgwMDAzMDMwMQorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzQgMHgwYzA0MGMwNAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTAxMAorIyBkZWZpbmUgT05FTkFORF9HUE1DX0NPTkZJRzYgMHgwMDAwMDAwMAorCisjZW5kaWYgLyogZW5kaWYgTDNfMTMzTUhaICovCisKKyNpZiBkZWZpbmVkIChMM18xNjVNSFopCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDA4MDAKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzIgMHgwMDE0MTQwMAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHMyAweDAwMTQxNDAwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwMTBGMDEKKyMgZGVmaW5lIFNNTkFORF9HUE1DX0NPTkZJRzUgMHgwMTBDMTQxNAorIyBkZWZpbmUgU01OQU5EX0dQTUNfQ09ORklHNiAweDFGMEYwQTgwCisjIGRlZmluZSBTTU5BTkRfR1BNQ19DT05GSUc3IDB4MDAwMDBDNDQKKworI2lmIGRlZmluZWQgKENPTkZJR19PTUFQMzRYWCkKKworIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMSAweDAwMDAxODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcyIFNNTkFORF9HUE1DX0NPTkZJRzIKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzMgU01OQU5EX0dQTUNfQ09ORklHMworIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNCBTTU5BTkRfR1BNQ19DT05GSUc0CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc1IFNNTkFORF9HUE1DX0NPTkZJRzUKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzYgU01OQU5EX0dQTUNfQ09ORklHNgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNyBTTU5BTkRfR1BNQ19DT05GSUc3CisKKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDE4MDAKKyNlbHNlCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDA4MDAKKyNlbmRpZgorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHMiAweDAwMDgwODAwCisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUczIDB4MDAwODA4MDAKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzQgMHgwNjAwMDYwMAorIyBkZWZpbmUgTV9OQU5EX0dQTUNfQ09ORklHNSAweDAwMDcwODA4CisjIGRlZmluZSBNX05BTkRfR1BNQ19DT05GSUc2IDB4MDAwMDAzY2YKKyMgZGVmaW5lIE1fTkFORF9HUE1DX0NPTkZJRzcgMHgwMDAwMDg0OAorCisjZW5kaWYKKworCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzEgIDB4MworIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUcyICAweDAwMTUxNTAxCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzMgIDB4MDAwNjA2MDIKKyMgZGVmaW5lIFNUTk9SX0dQTUNfQ09ORklHNCAgMHgxMTA5MTEwOQorIyBkZWZpbmUgU1ROT1JfR1BNQ19DT05GSUc1ICAweDAxMTQxRjFGCisjIGRlZmluZSBTVE5PUl9HUE1DX0NPTkZJRzYgIDB4MDAwMDA0YzQKKworIyBkZWZpbmUgU0lCTk9SX0dQTUNfQ09ORklHMSAgMHgxMjAwCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUcyICAweDAwMWYxZjAwCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUczICAweDAwMDgwODAyCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc0ICAweDFDMDkxQzA5CisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc1ICAweDAxMTMxRjFGCisjIGRlZmluZSBTSUJOT1JfR1BNQ19DT05GSUc2ICAweDFGMEYwM0MyCisKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUcxICAweDAwNjExMjAwCisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHMiAgMHgwMDFGMUYwMQorIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzMgIDB4MDAwODA4MDMKKyMgZGVmaW5lIFNEUFYyX01QREJfR1BNQ19DT05GSUc0ICAweDFEMDkxRDA5CisjIGRlZmluZSBTRFBWMl9NUERCX0dQTUNfQ09ORklHNSAgMHgwNDFEMUYxRgorIyBkZWZpbmUgU0RQVjJfTVBEQl9HUE1DX0NPTkZJRzYgIDB4MUQwOTA0QzQKKworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzEgIDB4MDAwMTEwMDAKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUcyICAweDAwMWYxZjAxCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHMyAgMHgwMDA4MDgwMworIyBkZWZpbmUgTVBEQl9HUE1DX0NPTkZJRzQgIDB4MWMwYjFjMGEKKyMgZGVmaW5lIE1QREJfR1BNQ19DT05GSUc1ICAweDA0MWYxRjFGCisjIGRlZmluZSBNUERCX0dQTUNfQ09ORklHNiAgMHgxRjBGMDRDNAorCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzEgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUcyICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHMyAgMHgwCisjIGRlZmluZSBQMl9HUE1DX0NPTkZJRzQgIDB4MAorIyBkZWZpbmUgUDJfR1BNQ19DT05GSUc1ICAweDAKKyMgZGVmaW5lIFAyX0dQTUNfQ09ORklHNiAgMHgwCisKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcxIDB4MDAwMDEyMDAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUcyIDB4MDAwRjBGMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUczIDB4MDAwMzAzMDEKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc0IDB4MEYwNDBGMDQKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc1IDB4MDEwRjEwMTAKKyMgZGVmaW5lIE9ORU5BTkRfR1BNQ19DT05GSUc2IDB4MUYwNjAwMDAKKworI2VuZGlmCisKKy8qIG1heCBudW1iZXIgb2YgR1BNQyBDaGlwIFNlbGVjdHMgKi8KKyNkZWZpbmUgR1BNQ19NQVhfQ1MgICAgOAorLyogbWF4IG51bWJlciBvZiBHUE1DIHJlZ3MgKi8KKyNkZWZpbmUgR1BNQ19NQVhfUkVHICAgNworCisjZGVmaW5lIFBJU01PMV9OT1IgICAgICAgMQorI2RlZmluZSBQSVNNTzFfTkFORCAgICAgIDIKKyNkZWZpbmUgUElTTU8yX0NTMCAgMworI2RlZmluZSBQSVNNTzJfQ1MxICA0CisjZGVmaW5lIFBJU01PMV9PTkVOQU5EICA1CisjZGVmaW5lIFBPUF9PTkVOQU5ECTUKKyNkZWZpbmUgREJHX01QREIgICAgICAgNgorI2RlZmluZSBQSVNNTzJfTkFORF9DUzAgNworI2RlZmluZSBQSVNNTzJfTkFORF9DUzEgOAorCisvKiBtYWtlIGl0IHJlYWRhYmxlIGZvciB0aGUgZ3BtY19pbml0ICovCisjZGVmaW5lIFBJU01PMV9OT1JfQkFTRQkJRkxBU0hfQkFTRQorI2RlZmluZSBQSVNNTzFfTkFORF9CQVNFCU5BTkRfQkFTRQorI2RlZmluZSBQSVNNTzJfQ1MwX0JBU0UJCVBJU01PMl9NQVAxCisjZGVmaW5lIFBJU01PMV9PTkVOX0JBU0UJT05FTkFORF9NQVAKKyNkZWZpbmUgUE9QX09ORU5fQkFTRQkJT05FTkFORF9NQVAKKyNkZWZpbmUgREJHX01QREJfQkFTRQkJREVCVUdfQkFTRQorCisjZW5kaWYgLyogZW5kaWYgX09NQVAzNFhYX01FTV9IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tbWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2JjZWI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvbW1jLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tbWMvbW1jX3B4YS5oCisgKgorICogIEF1dGhvcjogVmxhZGltaXIgU2hlYm9yZGFldiwgSWdvciBPYmxha292CisgKiAgQ29weXJpZ2h0OiAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogICRJZDogbW1jX3B4YS5oLHYgMC4zLjEuNiAyMDAyLzA5LzI1IDE5OjI1OjQ4IHRlZCBFeHAgdGVkICQKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9fTU1DX1BYQV9QX0hfXworI2RlZmluZSBfX01NQ19QWEFfUF9IX18KKworLyogUFhBLTI1MCBNTUMgY29udHJvbGxlciByZWdpc3RlcnMgKi8KKworLyogTU1DX1NUUlBDTCAqLworI2RlZmluZSBNTUNfU1RSUENMX1NUT1BfQ0xLICAgICAJKDB4MDAwMVVMKQorI2RlZmluZSBNTUNfU1RSUENMX1NUQVJUX0NMSwkJKDB4MDAwMlVMKQorCisvKiBNTUNfU1RBVCAqLworCisjZGVmaW5lIE1NQ19TVEFUX0VSUk9SUyAoTU1DX1NUQVRfUkVTX0NSQ19FUlJPUiB8IE1NQ19TVEFUX1NQSV9SRUFEX0VSUk9SX1RPS0VOXAorCXwgTU1DX1NUQVRfQ1JDX1JFQURfRVJST1IgfCBNTUNfU1RBVF9USU1FX09VVF9SRVNQT05TRSBcCisJfCBNTUNfU1RBVF9SRUFEX1RJTUVfT1VUIHwgTU1DX1NUQVRfQ1JDX1dSSVRFX0VSUk9SKQorCisvKiBNTUNfQ0xLUlQgKi8KKyNkZWZpbmUgTU1DX0NMS1JUXzIwTUhaCSAJCSgweDAwMDBVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzEwTUhaCSAJCSgweDAwMDFVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzVNSFoJICAJCSgweDAwMDJVTCkKKyNkZWZpbmUgTU1DX0NMS1JUXzJfNU1IWgkJKDB4MDAwM1VMKQorI2RlZmluZSBNTUNfQ0xLUlRfMV8yNU1IWiAgICAgICAJKDB4MDAwNFVMKQorI2RlZmluZSBNTUNfQ0xLUlRfMF82MjVNSFogICAgICAJKDB4MDAwNVVMKQorI2RlZmluZSBNTUNfQ0xLUlRfMF8zMTI1TUhaICAgICAJKDB4MDAwNlVMKQorCisvKiBNTUNfU1BJICovCisjZGVmaW5lIE1NQ19TUElfRElTQUJMRQkgCQkoMHgwMFVMKQorI2RlZmluZSBNTUNfU1BJX0VOCSAgCQkoMHgwMVVMKQorI2RlZmluZSBNTUNfU1BJX0NTX0VOCSAgIAkJKDB4MDFVTCA8PCAyKQorI2RlZmluZSBNTUNfU1BJX0NTX0FERFJFU1MgICAgICAJKDB4MDFVTCA8PCAzKQorI2RlZmluZSBNTUNfU1BJX0NSQ19PTgkgIAkJKDB4MDFVTCA8PCAxKQorCisvKiBNTUNfQ01EQVQgKi8KKyNkZWZpbmUgTU1DX0NNREFUX01NQ19ETUFfRU4JCSgweDAwMDFVTCA8PCA3KQorI2RlZmluZSBNTUNfQ01EQVRfSU5JVAkgIAkJKDB4MDAwMVVMIDw8IDYpCisjZGVmaW5lIE1NQ19DTURBVF9CVVNZCSAgCQkoMHgwMDAxVUwgPDwgNSkKKyNkZWZpbmUgTU1DX0NNREFUX1NUUkVBTQkJKDB4MDAwMVVMIDw8IDQpCisjZGVmaW5lIE1NQ19DTURBVF9CTE9DSwkgCQkoMHgwMDAwVUwgPDwgNCkKKyNkZWZpbmUgTU1DX0NNREFUX1dSSVRFCSAJCSgweDAwMDFVTCA8PCAzKQorI2RlZmluZSBNTUNfQ01EQVRfUkVBRAkgIAkJKDB4MDAwMFVMIDw8IDMpCisjZGVmaW5lIE1NQ19DTURBVF9EQVRBX0VOICAgICAgIAkoMHgwMDAxVUwgPDwgMikKKyNkZWZpbmUgTU1DX0NNREFUX1IxCSAgICAJCSgweDAwMDFVTCkKKyNkZWZpbmUgTU1DX0NNREFUX1IyCSAgICAJCSgweDAwMDJVTCkKKyNkZWZpbmUgTU1DX0NNREFUX1IzCSAgICAJCSgweDAwMDNVTCkKKworLyogTU1DX1JFU1RPICovCisjZGVmaW5lIE1NQ19SRVNfVE9fTUFYCSAgCQkoMHgwMDdmVUwpIC8qIFs2OjBdICovCisKKy8qIE1NQ19SRFRPICovCisjZGVmaW5lIE1NQ19SRUFEX1RPX01BWAkgCQkoMHgwZmZmZlVMKSAvKiBbMTU6MF0gKi8KKworLyogTU1DX0JMS0xFTiAqLworI2RlZmluZSBNTUNfQkxLX0xFTl9NQVgJIAkJKDB4MDNmZlVMKSAvKiBbOTowXSAqLworCisvKiBNTUNfUFJUQlVGICovCisjZGVmaW5lIE1NQ19QUlRCVUZfQlVGX1BBUlRfRlVMTCAgICAgICAJKDB4MDFVTCkKKyNkZWZpbmUgTU1DX1BSVEJVRl9CVUZfRlVMTAkJKDB4MDBVTCkKKworLyogTU1DX0lfTUFTSyAqLworI2RlZmluZSBNTUNfSV9NQVNLX1RYRklGT19XUl9SRVEJKDB4MDFVTCA8PCA2KQorI2RlZmluZSBNTUNfSV9NQVNLX1JYRklGT19SRF9SRVEJKDB4MDFVTCA8PCA1KQorI2RlZmluZSBNTUNfSV9NQVNLX0NMS19JU19PRkYJICAgCSgweDAxVUwgPDwgNCkKKyNkZWZpbmUgTU1DX0lfTUFTS19TVE9QX0NNRAkgCSgweDAxVUwgPDwgMykKKyNkZWZpbmUgTU1DX0lfTUFTS19FTkRfQ01EX1JFUwkgIAkoMHgwMVVMIDw8IDIpCisjZGVmaW5lIE1NQ19JX01BU0tfUFJHX0RPTkUJIAkoMHgwMVVMIDw8IDEpCisjZGVmaW5lIE1NQ19JX01BU0tfREFUQV9UUkFOX0RPTkUgICAgICAgKDB4MDFVTCkKKyNkZWZpbmUgTU1DX0lfTUFTS19BTEwJICAgICAgCQkoMHgwN2ZVTCkKKworCisvKiBNTUNfSV9SRUcgKi8KKyNkZWZpbmUgTU1DX0lfUkVHX1RYRklGT19XUl9SRVEgICAgIAkoMHgwMVVMIDw8IDYpCisjZGVmaW5lIE1NQ19JX1JFR19SWEZJRk9fUkRfUkVRICAgICAJKDB4MDFVTCA8PCA1KQorI2RlZmluZSBNTUNfSV9SRUdfQ0xLX0lTX09GRgkJKDB4MDFVTCA8PCA0KQorI2RlZmluZSBNTUNfSV9SRUdfU1RPUF9DTUQgICAgICAJKDB4MDFVTCA8PCAzKQorI2RlZmluZSBNTUNfSV9SRUdfRU5EX0NNRF9SRVMgICAgICAgCSgweDAxVUwgPDwgMikKKyNkZWZpbmUgTU1DX0lfUkVHX1BSR19ET05FICAgICAgCSgweDAxVUwgPDwgMSkKKyNkZWZpbmUgTU1DX0lfUkVHX0RBVEFfVFJBTl9ET05FICAgIAkoMHgwMVVMKQorI2RlZmluZSBNTUNfSV9SRUdfQUxMCSAgIAkJKDB4MDA3ZlVMKQorCisvKiBNTUNfQ01EICovCisjZGVmaW5lIE1NQ19DTURfSU5ERVhfTUFYICAgICAgIAkoMHgwMDZmVUwpICAvKiBbNTowXSAqLworI2RlZmluZSBDTUQoeCkgICh4KQorCisjZGVmaW5lIE1NQ19ERUZBVUxUX1JDQQkJCTEKKworI2RlZmluZSBNTUNfQkxPQ0tfU0laRQkJCTUxMgorI2RlZmluZSBNTUNfQ01EX1JFU0VUCQkJMAorI2RlZmluZSBNTUNfQ01EX1NFTkRfT1BfQ09ORAkJMQorI2RlZmluZSBNTUNfQ01EX0FMTF9TRU5EX0NJRCAJCTIKKyNkZWZpbmUgTU1DX0NNRF9TRVRfUkNBCQkJMworI2RlZmluZSBNTUNfQ01EX1NFTkRfQ1NEIAkJOQorI2RlZmluZSBNTUNfQ01EX1NFTkRfQ0lEIAkJMTAKKyNkZWZpbmUgTU1DX0NNRF9TRU5EX1NUQVRVUwkJMTMKKyNkZWZpbmUgTU1DX0NNRF9TRVRfQkxPQ0tMRU4JCTE2CisjZGVmaW5lIE1NQ19DTURfUkVBRF9CTE9DSwkJMTcKKyNkZWZpbmUgTU1DX0NNRF9SRF9CTEtfTVVMVEkJCTE4CisjZGVmaW5lIE1NQ19DTURfV1JJVEVfQkxPQ0sJCTI0CisKKyNkZWZpbmUgTU1DX01BWF9CTE9DS19TSVpFCQk1MTIKKworI2RlZmluZSBNTUNfUjFfSURMRV9TVEFURQkJMHgwMQorI2RlZmluZSBNTUNfUjFfRVJBU0VfU1RBVEUJCTB4MDIKKyNkZWZpbmUgTU1DX1IxX0lMTEVHQUxfQ01ECQkweDA0CisjZGVmaW5lIE1NQ19SMV9DT01fQ1JDX0VSUgkJMHgwOAorI2RlZmluZSBNTUNfUjFfRVJBU0VfU0VRX0VSUgkJMHgwMQorI2RlZmluZSBNTUNfUjFfQUREUl9FUlIJCQkweDAyCisjZGVmaW5lIE1NQ19SMV9QQVJBTV9FUlIJCTB4MDQKKworI2RlZmluZSBNTUNfUjFCX1dQX0VSQVNFX1NLSVAJCTB4MDAwMgorI2RlZmluZSBNTUNfUjFCX0VSUgkJCTB4MDAwNAorI2RlZmluZSBNTUNfUjFCX0NDX0VSUgkJCTB4MDAwOAorI2RlZmluZSBNTUNfUjFCX0NBUkRfRUNDX0VSUgkJMHgwMDEwCisjZGVmaW5lIE1NQ19SMUJfV1BfVklPTEFUSU9OCQkweDAwMjAKKyNkZWZpbmUgTU1DX1IxQl9FUkFTRV9QQVJBTQkJMHgwMDQwCisjZGVmaW5lIE1NQ19SMUJfT09SCQkJMHgwMDgwCisjZGVmaW5lIE1NQ19SMUJfSURMRV9TVEFURQkJMHgwMTAwCisjZGVmaW5lIE1NQ19SMUJfRVJBU0VfUkVTRVQJCTB4MDIwMAorI2RlZmluZSBNTUNfUjFCX0lMTEVHQUxfQ01ECQkweDA0MDAKKyNkZWZpbmUgTU1DX1IxQl9DT01fQ1JDX0VSUgkJMHgwODAwCisjZGVmaW5lIE1NQ19SMUJfRVJBU0VfU0VRX0VSUgkJMHgxMDAwCisjZGVmaW5lIE1NQ19SMUJfQUREUl9FUlIJCTB4MjAwMAorI2RlZmluZSBNTUNfUjFCX1BBUkFNX0VSUgkJMHg0MDAwCisKK3R5cGVkZWYgc3RydWN0IG1tY19jaWQgeworLyogRklYTUU6IEJZVEVfT1JERVIgKi8KKwl1bnNpZ25lZCBjaGFyIHllYXI6NCwKKwkJbW9udGg6NDsKKwl1bnNpZ25lZCBjaGFyIHNuWzNdOworCXVuc2lnbmVkIGNoYXIgZndyZXY6NCwKKwkJaHdyZXY6NDsKKwl1bnNpZ25lZCBjaGFyIG5hbWVbNl07CisJdW5zaWduZWQgY2hhciBpZFszXTsKK30gbW1jX2NpZF90OworCit0eXBlZGVmIHN0cnVjdCBtbWNfY3NkCit7CisJdW5zaWduZWQgY2hhcgllY2M6MiwKKwkJZmlsZV9mb3JtYXQ6MiwKKwkJdG1wX3dyaXRlX3Byb3RlY3Q6MSwKKwkJcGVybV93cml0ZV9wcm90ZWN0OjEsCisJCWNvcHk6MSwKKwkJZmlsZV9mb3JtYXRfZ3JwOjE7CisJdW5zaWduZWQgbG9uZyBpbnQgY29udGVudF9wcm90X2FwcDoxLAorCQlyc3ZkMzo0LAorCQl3cml0ZV9ibF9wYXJ0aWFsOjEsCisJCXdyaXRlX2JsX2xlbjo0LAorCQlyMndfZmFjdG9yOjMsCisJCWRlZmF1bHRfZWNjOjIsCisJCXdwX2dycF9lbmFibGU6MSwKKwkJd3BfZ3JwX3NpemU6NSwKKwkJZXJhc2VfZ3JwX211bHQ6NSwKKwkJZXJhc2VfZ3JwX3NpemU6NSwKKwkJY19zaXplX211bHQxOjMsCisJCXZkZF93X2N1cnJfbWF4OjMsCisJCXZkZF93X2N1cnJfbWluOjMsCisJCXZkZF9yX2N1cnJfbWF4OjMsCisJCXZkZF9yX2N1cnJfbWluOjMsCisJCWNfc2l6ZToxMiwKKwkJcnN2ZDI6MiwKKwkJZHNyX2ltcDoxLAorCQlyZWFkX2Jsa19taXNhbGlnbjoxLAorCQl3cml0ZV9ibGtfbWlzYWxpZ246MSwKKwkJcmVhZF9ibF9wYXJ0aWFsOjE7CisKKwl1bnNpZ25lZCBzaG9ydAlyZWFkX2JsX2xlbjo0LAorCQljY2M6MTI7CisJdW5zaWduZWQgY2hhcgl0cmFuX3NwZWVkOworCXVuc2lnbmVkIGNoYXIJbnNhYzsKKwl1bnNpZ25lZCBjaGFyCXRhYWM7CisJdW5zaWduZWQgY2hhcglyc3ZkMToyLAorICAJCXNwZWNfdmVyczo0LAorCQljc2Rfc3RydWN0dXJlOjI7Cit9IG1tY19jc2RfdDsKKworCisjZW5kaWYgLyogX19NTUNfUFhBX1BfSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL211eC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzAxYzczCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9tdXguaApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNi0yMDA4CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9NVVhfSF8KKyNkZWZpbmUgX01VWF9IXworCisvKgorICogSUVOICAtIElucHV0IEVuYWJsZQorICogSURJUyAtIElucHV0IERpc2FibGUKKyAqIFBURCAgLSBQdWxsIHR5cGUgRG93bgorICogUFRVICAtIFB1bGwgdHlwZSBVcAorICogRElTICAtIFB1bGwgdHlwZSBzZWxlY3Rpb24gaXMgaW5hY3RpdmUKKyAqIEVOICAgLSBQdWxsIHR5cGUgc2VsZWN0aW9uIGlzIGFjdGl2ZQorICogTTAgICAtIE1vZGUgMAorICovCisKKyNkZWZpbmUgSUVOCSgxIDw8IDgpCisKKyNkZWZpbmUgSURJUwkoMCA8PCA4KQorI2RlZmluZSBQVFUJKDEgPDwgNCkKKyNkZWZpbmUgUFRECSgwIDw8IDQpCisjZGVmaW5lIEVOCSgxIDw8IDMpCisjZGVmaW5lIERJUwkoMCA8PCAzKQorCisjZGVmaW5lIE0wCTAKKyNkZWZpbmUgTTEJMQorI2RlZmluZSBNMgkyCisjZGVmaW5lIE0zCTMKKyNkZWZpbmUgTTQJNAorI2RlZmluZSBNNQk1CisjZGVmaW5lIE02CTYKKyNkZWZpbmUgTTcJNworCisvKgorICogVG8gZ2V0IHRoZSBhY3R1YWwgYWRkcmVzcyB0aGUgb2Zmc2V0IGhhcyB0byBhZGRlZAorICogd2l0aCBPTUFQMzRYWF9DVFJMX0JBU0UgdG8gZ2V0IHRoZSBhY3R1YWwgYWRkcmVzcworICovCisKKy8qU0RSQyovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QwCQkweDAwMzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDEJCTB4MDAzMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMgkJMHgwMDM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QzCQkweDAwMzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDQJCTB4MDAzOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19ENQkJMHgwMDNBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q2CQkweDAwM0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDcJCTB4MDAzRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EOAkJMHgwMDQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0Q5CQkweDAwNDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDEwCTB4MDA0NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTEJMHgwMDQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxMgkweDAwNDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDEzCTB4MDA0QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTQJMHgwMDRDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxNQkweDAwNEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE2CTB4MDA1MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMTcJMHgwMDUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QxOAkweDAwNTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDE5CTB4MDA1NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjAJMHgwMDU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyMQkweDAwNUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDIyCTB4MDA1QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjMJMHgwMDVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyNAkweDAwNjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI1CTB4MDA2MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjYJMHgwMDY0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QyNwkweDAwNjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDI4CTB4MDA2OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19EMjkJMHgwMDZBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0QzMAkweDAwNkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NEUkNfRDMxCTB4MDA2RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19DTEsJMHgwMDcwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0RRUzAJMHgwMDcyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0RRUzEJMHgwMDc0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0RRUzIJMHgwMDc2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TRFJDX0RRUzMJMHgwMDc4CisvKkdQTUMqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BMQkJMHgwMDdBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0EyCQkweDAwN0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTMJCTB4MDA3RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BNAkJMHgwMDgwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E1CQkweDAwODIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTYJCTB4MDA4NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BNwkJMHgwMDg2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0E4CQkweDAwODgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQTkJCTB4MDA4QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19BMTAJMHgwMDhDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QwCQkweDAwOEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDEJCTB4MDA5MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMgkJMHgwMDkyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QzCQkweDAwOTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDQJCTB4MDA5NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19ENQkJMHgwMDk4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q2CQkweDAwOUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDcJCTB4MDA5QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EOAkJMHgwMDlFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0Q5CQkweDAwQTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDEwCTB4MDBBMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTEJMHgwMEE0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxMgkweDAwQTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfRDEzCTB4MDBBOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19EMTQJMHgwMEFBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX0QxNQkweDAwQUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTMAkweDAwQUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTMQkweDAwQjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTMgkweDAwQjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTMwkweDAwQjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTNAkweDAwQjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTNQkweDAwQjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTNgkweDAwQkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTkNTNwkweDAwQkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfQ0xLCTB4MDBCRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQURWX0FMRQkweDAwQzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfTk9FCTB4MDBDMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OV0UJMHgwMEM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX05CRTBfQ0xFCTB4MDBDNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OQkUxCTB4MDBDOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19OV1AJMHgwMENBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX1dBSVQwCTB4MDBDQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfR1BNQ19XQUlUMQkweDAwQ0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0dQTUNfV0FJVDIJMHgwMEQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9HUE1DX1dBSVQzCTB4MDBEMgorLypEU1MqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX1BDTEsJMHgwMEQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfSFNZTkMJMHgwMEQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfVlNZTkMJMHgwMEQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfQUNCSUFTCTB4MDBEQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEwCTB4MDBEQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExCTB4MDBERQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyCTB4MDBFMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEzCTB4MDBFMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE0CTB4MDBFNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE1CTB4MDBFNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE2CTB4MDBFOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE3CTB4MDBFQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE4CTB4MDBFQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEE5CTB4MDBFRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExMAkweDAwRjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTEJMHgwMEYyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTEyCTB4MDBGNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExMwkweDAwRjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTQJMHgwMEY4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE1CTB4MDBGQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExNgkweDAwRkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMTcJMHgwMEZFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTE4CTB4MDEwMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEExOQkweDAxMDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjAJMHgwMTA0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EU1NfREFUQTIxCTB4MDEwNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRFNTX0RBVEEyMgkweDAxMDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0RTU19EQVRBMjMJMHgwMTBBCisvKkNBTUVSQSovCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fSFMJCTB4MDEwQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1ZTCQkweDAxMEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9YQ0xLQQkweDAxMTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9QQ0xLCTB4MDExMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0ZMRAkJMHgwMTE0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDAJCTB4MDExNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QxCQkweDAxMTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EMgkJMHgwMTFBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDMJCTB4MDExQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q0CQkweDAxMUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9ENQkJMHgwMTIwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDYJCTB4MDEyMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0Q3CQkweDAxMjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9EOAkJMHgwMTI2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDkJCTB4MDEyOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX0QxMAkJMHgwMTJBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DQU1fRDExCQkweDAxMkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9YQ0xLQgkweDAxMkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NBTV9XRU4JCTB4MDEzMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ0FNX1NUUk9CRQkweDAxMzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NTSTJfRFgwCTB4MDEzNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfQ1NJMl9EWTAJMHgwMTM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9DU0kyX0RYMQkweDAxMzgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0NTSTJfRFkxCTB4MDEzQQorLypBdWRpbyBJbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMl9GU1gJMHgwMTNDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDJfQ0xLWAkweDAxM0UKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMl9EUgkweDAxNDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMl9EWAkweDAxNDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzFfQ0xLCTB4MDE0NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMV9DTUQJMHgwMTQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDAJMHgwMTQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDEJMHgwMTRBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDIJMHgwMTRDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDMJMHgwMTRFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDQJMHgwMTUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDUJMHgwMTUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDYJMHgwMTU0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMxX0RBVDcJMHgwMTU2CisvKldpcmVsZXNzIExBTiAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTU1DMl9DTEsJMHgwMTU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NTUMyX0NNRAkweDAxNUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUMAkweDAxNUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUMQkweDAxNUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUMgkweDAxNjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUMwkweDAxNjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUNAkweDAxNjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUNQkweDAxNjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUNgkweDAxNjgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01NQzJfREFUNwkweDAxNkEKKy8qQmx1ZXRvb3RoKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQM19EWAkweDAxNkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQM19EUgkweDAxNkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQM19DTEtYCTB4MDE3MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AzX0ZTWAkweDAxNzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQyX0NUUwkweDAxNzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQyX1JUUwkweDAxNzYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1VBUlQyX1RYCTB4MDE3OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDJfUlgJMHgwMTdBCisvKk1vZGVtIEludGVyZmFjZSAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDFfVFgJMHgwMTdDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9SVFMJMHgwMTdFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9DVFMJMHgwMTgwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUMV9SWAkweDAxODIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQNF9DTEtYCTB4MDE4NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1A0X0RSCTB4MDE4NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1A0X0RYCTB4MDE4OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1A0X0ZTWAkweDAxOEEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9DTEtSCTB4MDE4QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0ZTUgkweDAxOEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9EWAkweDAxOTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQMV9EUgkweDAxOTIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DQlNQX0NMS1MJMHgwMTk0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ0JTUDFfRlNYCTB4MDE5NgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNCU1AxX0NMS1gJMHgwMTk4CisvKlNlcmlhbCBJbnRlcmZhY2UqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDNfQ1RTX1JDVFgJMHgwMTlBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUM19SVFNfU0QJMHgwMTlDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9VQVJUM19SWF9JUlJYCTB4MDE5RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfVUFSVDNfVFhfSVJUWAkweDAxQTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9DTEsJMHgwMUEyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfU1RQCTB4MDFBNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSFNVU0IwX0RJUgkweDAxQTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0hTVVNCMF9OWFQJMHgwMUE4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTAJMHgwMUFBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTEJMHgwMUFDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTIJMHgwMUFFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTMJMHgwMUIwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTQJMHgwMUIyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTUJMHgwMUI0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTYJMHgwMUI2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9IU1VTQjBfREFUQTcJMHgwMUI4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMxX1NDTAkweDAxQkEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzFfU0RBCTB4MDFCQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDMl9TQ0wJMHgwMUJFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkMyX1NEQQkweDAxQzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzNfU0NMCTB4MDFDMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSTJDM19TREEJMHgwMUM0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9JMkM0X1NDTAkweDBBMDAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0kyQzRfU0RBCTB4MEEwMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSERRX1NJTwkJMHgwMUM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfQ0xLCTB4MDFDOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX1NJTU8JMHgwMUNBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfU09NSQkweDAxQ0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9DUzAJMHgwMUNFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTFfQ1MxCTB4MDFEMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkxX0NTMgkweDAxRDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMV9DUzMJMHgwMUQ0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTJfQ0xLCTB4MDFENgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfTUNTUEkyX1NJTU8JMHgwMUQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTJfU09NSQkweDAxREEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX01DU1BJMl9DUzAJMHgwMURDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9NQ1NQSTJfQ1MxCTB4MDFERQorLypDb250cm9sIGFuZCBkZWJ1ZyAqLworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTXzMySwkJMHgwQTA0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQ0xLUkVRCTB4MEEwNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU1lTX05JUlEJMHgwMUUwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDAJMHgwQTBBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDEJMHgwQTBDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDIJMHgwQTBFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDMJMHgwQTEwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDQJMHgwQTEyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDUJMHgwQTE0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQk9PVDYJMHgwQTE2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfT0ZGX01PREUJMHgwQTE4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9TWVNfQ0xLT1VUMQkweDBBMUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX1NZU19DTEtPVVQyCTB4MDFFMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19uVFJTVAkweDBBMUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfVENLCTB4MEExRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfSlRBR19UTVMJMHgwQTIwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9KVEFHX1RESQkweDBBMjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfRU1VMAkweDBBMjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0pUQUdfRU1VMQkweDBBMjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19DTEsJCTB4MEEyOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0NUTAkJMHgwQTJBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDAJCTB4MEEyQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxCQkweDBBMkUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMgkJMHgwQTMwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDMJCTB4MEEzMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q0CQkweDBBMzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENQkJMHgwQTM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDYJCTB4MEEzOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q3CQkweDBBM0EKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EOAkJMHgwQTNDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDkJCTB4MEEzRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMAkJMHgwQTQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDExCQkweDBBNDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTIJCTB4MEE0NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMwkJMHgwQTQ2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDE0CQkweDBBNDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTUJCTB4MEE0QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0NMS19FUzIJMHgwNUQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfQ1RMX0VTMgkweDA1REEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMF9FUzIJMHgwNURDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDFfRVMyCTB4MDVERQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QyX0VTMgkweDA1RTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EM19FUzIJMHgwNUUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDRfRVMyCTB4MDVFNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q1X0VTMgkweDA1RTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19ENl9FUzIJMHgwNUU4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDdfRVMyCTB4MDVFQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0Q4X0VTMgkweDA1RUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EOV9FUzIJMHgwNUVFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEwX0VTMgkweDA1RjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTFfRVMyCTB4MDVGMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxMl9FUzIJMHgwNUY0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9FVEtfRDEzX0VTMgkweDA1RjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0VUS19EMTRfRVMyCTB4MDVGOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRVRLX0QxNV9FUzIJMHgwNUZBCisvKkRpZSB0byBEaWUgKi8KKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMAkweDAxRTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMQkweDAxRTYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMgkweDAxRTgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMwkweDAxRUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FENAkweDAxRUMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FENQkweDAxRUUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FENgkweDAxRjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FENwkweDAxRjIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEOAkweDAxRjQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEOQkweDAxRjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTAJMHgwMUY4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDExCTB4MDFGQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxMgkweDAxRkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTMJMHgwMUZFCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE0CTB4MDIwMAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxNQkweDAyMDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTYJMHgwMjA0CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDE3CTB4MDIwNgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQxOAkweDAyMDgKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMTkJMHgwMjBBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDIwCTB4MDIwQworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyMQkweDAyMEUKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjIJMHgwMjEwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDIzCTB4MDIxMgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyNAkweDAyMTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjUJMHgwMjE2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI2CTB4MDIxOAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQyNwkweDAyMUEKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMjgJMHgwMjFDCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDI5CTB4MDIxRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzMAkweDAyMjAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzEJMHgwMjIyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDMyCTB4MDIyNAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzMwkweDAyMjYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NQ0FEMzQJMHgwMjI4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTUNBRDM1CTB4MDIyQQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01DQUQzNgkweDAyMkMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9DTEsyNk1JCTB4MDIyRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX05SRVNQV1JPTgkweDAyMzAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OUkVTV0FSTQkweDAyMzIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9BUk05TklSUQkweDAyMzQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9VTUEyUDZGSVEJMHgwMjM2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfU1BJTlQJMHgwMjM4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfRlJJTlQJMHgwMjNBCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfRE1BUkVRMAkweDAyM0MKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9ETUFSRVExCTB4MDIzRQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0RNQVJFUTIJMHgwMjQwCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfRE1BUkVRMwkweDAyNDIKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dUUlNUCTB4MDI0NAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1RESQkweDAyNDYKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dURE8JMHgwMjQ4CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfTjNHVE1TCTB4MDI0QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX04zR1RDSwkweDAyNEMKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9OM0dSVENLCTB4MDI0RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01TVERCWQkweDAyNTAKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9TV0FLRVVQCTB4MEE0QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX0lETEVSRVEJMHgwMjUyCisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfSURMRUFDSwkweDAyNTQKKyNkZWZpbmUgQ09OVFJPTF9QQURDT05GX0QyRF9NV1JJVEUJMHgwMjU2CisjZGVmaW5lIENPTlRST0xfUEFEQ09ORl9EMkRfU1dSSVRFCTB4MDI1OAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01SRUFECTB4MDI1QQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1NSRUFECTB4MDI1QworI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX01CVVNGTEFHCTB4MDI1RQorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfRDJEX1NCVVNGTEFHCTB4MDI2MAorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19DS0UwCTB4MDI2MgorI2RlZmluZSBDT05UUk9MX1BBRENPTkZfU0RSQ19DS0UxCTB4MDI2NAorCisjZGVmaW5lIE1VWF9WQUwoT0ZGU0VULFZBTFVFKVwKKwl3cml0ZXcoKFZBTFVFKSwgT01BUDM0WFhfQ1RSTF9CQVNFICsgKE9GRlNFVCkpOworCisjZGVmaW5lCUNQKHgpCShDT05UUk9MX1BBRENPTkZfIyN4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvb21hcDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTM5MmNjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKiBTeWVkIE1vaGFtbWVkIEtoYXNpbSA8eDBraGFzaW1AdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAzX1NZU19IXworI2RlZmluZSBfT01BUDNfU1lTX0hfCisKKyNpbmNsdWRlIDxhc20vYXJjaC9zaXplcy5oPgorCisvKgorICogT01BUDMgc3BlY2lmaWMgU2VjdGlvbgorICovCisKKy8qIFN0dWZmIG9uIEwzIEludGVyY29ubmVjdCAqLworI2RlZmluZSBTTVhfQVBFX0JBU0UJCQkweDY4MDAwMDAwCisKKy8qIEwzIEZpcmV3YWxsICovCisjZGVmaW5lIEFfUkVRSU5GT1BFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA0OCkKKyNkZWZpbmUgQV9SRUFEUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDUwKQorI2RlZmluZSBBX1dSSVRFUEVSTTAJCShTTVhfQVBFX0JBU0UgKyAweDA1MDU4KQorCisvKiBHUE1DICovCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQkFTRQkJKDB4NkUwMDAwMDApCisKKy8qIFNNUyAqLworI2RlZmluZSBPTUFQMzRYWF9TTVNfQkFTRQkJMHg2QzAwMDAwMAorCisvKiBTRFJDICovCisjZGVmaW5lIE9NQVAzNFhYX1NEUkNfQkFTRQkJMHg2RDAwMDAwMAorCisvKgorICogTDQgUGVyaXBoZXJhbHMgLSBMNCBXYWtldXAgYW5kIEw0IENvcmUgbm93CisgKi8KKyNkZWZpbmUgT01BUDM0WFhfQ09SRV9MNF9JT19CQVNFCTB4NDgwMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9XQUtFVVBfTDRfSU9fQkFTRQkweDQ4MzAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfTDRfUEVSCQkJMHg0OTAwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX0w0X0lPX0JBU0UJCU9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRQorCisvKiBDT05UUk9MICovCisjZGVmaW5lIE9NQVAzNFhYX0NUUkxfQkFTRQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHgyMDAwKQorCisvKiBUQVAgaW5mb3JtYXRpb24gIGRvbnQga25vdyBmb3IgMzQzMCovCisjZGVmaW5lIE9NQVAzNFhYX1RBUF9CQVNFCQkoMHg0OTAwMDAwMCkgLypnaXZpbmcgc29tZSBqdW5rIGZvciB2aXJ0aW8gKi8KKworLyogVUFSVCAqLworI2RlZmluZSBPTUFQMzRYWF9VQVJUMQkJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4NmEwMDApCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQyCQkJKE9NQVAzNFhYX0w0X0lPX0JBU0UrMHg2YzAwMCkKKyNkZWZpbmUgT01BUDM0WFhfVUFSVDMJCQkoT01BUDM0WFhfTDRfUEVSKzB4MjAwMDApCisKKy8qIEdlbmVyYWwgUHVycG9zZSBUaW1lcnMgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BUMQkJCTB4NDgzMTgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMgkJCTB4NDkwMzIwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMwkJCTB4NDkwMzQwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNAkJCTB4NDkwMzYwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNQkJCTB4NDkwMzgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNgkJCTB4NDkwM0EwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUNwkJCTB4NDkwM0MwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUOAkJCTB4NDkwM0UwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUOQkJCTB4NDkwNDAwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTAJCQkweDQ4MDg2MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDExCQkJMHg0ODA4ODAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMgkJCTB4NDgzMDQwMDAKKworLyogV2F0Y2hEb2cgVGltZXJzICgxIHNlY3VyZSwgMyBHUCkgKi8KKyNkZWZpbmUgV0QxX0JBU0UJCQkoMHg0ODMwQzAwMCkKKyNkZWZpbmUgV0QyX0JBU0UJCQkoMHg0ODMxNDAwMCkKKyNkZWZpbmUgV0QzX0JBU0UJCQkoMHg0OTAzMDAwMCkKKworLyogMzJLVElNRVIgKi8KKyNkZWZpbmUgU1lOQ18zMktUSU1FUl9CQVNFCQkoMHg0ODMyMDAwMCkKKyNkZWZpbmUgUzMyS19DUgkJCQkoU1lOQ18zMktUSU1FUl9CQVNFKzB4MTApCisKKy8qCisgKiBTRFAzNDMwIHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKgorICogIFRoZSAzNDN4J3MgY2hpcCBzZWxlY3RzIGFyZSBwcm9ncmFtbWFibGUuICBUaGUgbWFzayBST00KKyAqICBkb2VzIGNvbmZpZ3VyZSBDUzAgdG8gMHgwODAwMDAwMCBiZWZvcmUgZGlzcGF0Y2guICBTbywgaWYKKyAqICB5b3Ugd2FudCB5b3VyIGNvZGUgdG8gbGl2ZSBiZWxvdyB0aGF0IGFkZHJlc3MsIHlvdSBoYXZlIHRvCisgKiAgYmUgcHJlcGFyZWQgdG8ganVtcCB0aG91Z2ggaG9vcHMsIHRvIHJlc2V0IHRoZSBiYXNlIGFkZHJlc3MuCisgKiAgU2FtZSBhcyBpbiBTRFAzNDMwCisgKi8KKy8qIGJhc2UgYWRkcmVzcyBmb3IgaW5kaXJlY3QgdmVjdG9ycyAoaW50ZXJuYWwgYm9vdCBtb2RlKSAqLworI2RlZmluZSBTUkFNX09GRlNFVDAJCQkweDQwMDAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMQkJCTB4MDAyMDAwMDAKKyNkZWZpbmUgU1JBTV9PRkZTRVQyCQkJMHgwMDAwRjgwMAorI2RlZmluZSBTUkFNX1ZFQ1RfQ09ERQkJCShTUkFNX09GRlNFVDB8U1JBTV9PRkZTRVQxfFNSQU1fT0ZGU0VUMikKKworI2RlZmluZSBMT1dfTEVWRUxfU1JBTV9TVEFDSwkJMHg0MDIwRkZGQworCisvKgorICogVE9ETzogQXJlIHRoZXkgcmVxdWlyZWQgZm9yIEFNMzUxNz8KKyAqLworI2lmIGRlZmluZWQoQ09ORklHXzM0MzBTRFApIHx8IGRlZmluZWQoQ09ORklHX09NQVAzRVZNKQorLyogRlBHQSBvbiBEZWJ1ZyBib2FyZC4qLworI2RlZmluZSBFVEhfQ09OVFJPTF9SRUcJCQkoREVCVUdfQkFTRSsweDMwYikKKyNkZWZpbmUgTEFOX1JFU0VUX1JFR0lTVEVSCQkoREVCVUdfQkFTRSsweDFjKQorCisjZGVmaW5lIERJUF9TV0lUQ0hfSU5QVVRfUkVHMgkJKERFQlVHX0JBU0UrMHg2MCkKKyNkZWZpbmUgTEVEX1JFR0lTVEVSCQkJKERFQlVHX0JBU0UrMHg0MCkKKyNkZWZpbmUgRlBHQV9SRVZfUkVHSVNURVIJCShERUJVR19CQVNFKzB4MTApCisjZGVmaW5lIEVFUFJPTV9NQUlOX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxODAwKQorI2RlZmluZSBFRVBST01fQ09OTl9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MTkwMCkKKyNkZWZpbmUgRUVQUk9NX1VJX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxQTAwKQorI2RlZmluZSBFRVBST01fTUNBTV9CUkQJCQkoREVCVUdfQkFTRSsweDEwMDAwKzB4MUIwMCkKKyNkZWZpbmUgRU5IQU5DRURfVUlfRUVfTkFNRQkJIjc1MC0yMDc1IgorI2VuZGlmCisKKyNlbmRpZiAgLyogX09NQVAzNDMwX1NZU19IXyAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMzQzMC5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9vbWFwMzQzMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2RlNjMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL29tYXAzNDMwLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqIFN5ZWQgTW9oYW1tZWQgS2hhc2ltIDx4MGtoYXNpbUB0aS5jb20+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfT01BUDM0MzBfU1lTX0hfCisjZGVmaW5lIF9PTUFQMzQzMF9TWVNfSF8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qCisgKiAzNDMwIHNwZWNpZmljIFNlY3Rpb24KKyAqLworCisvKiBTdHVmZiBvbiBMMyBJbnRlcmNvbm5lY3QgKi8KKyNkZWZpbmUgU01YX0FQRV9CQVNFCQkJMHg2ODAwMDAwMAorCisvKiBMMyBGaXJld2FsbCAqLworI2RlZmluZSBBX1JFUUlORk9QRVJNMAkJKFNNWF9BUEVfQkFTRSArIDB4MDUwNDgpCisjZGVmaW5lIEFfUkVBRFBFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA1MCkKKyNkZWZpbmUgQV9XUklURVBFUk0wCQkoU01YX0FQRV9CQVNFICsgMHgwNTA1OCkKKworLyogR1BNQyAqLworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0JBU0UJCSgweDZFMDAwMDAwKQorCisvKiBTTVMgKi8KKyNkZWZpbmUgT01BUDM0WFhfU01TX0JBU0UJCTB4NkMwMDAwMDAKKworLyogU0RSQyAqLworI2RlZmluZSBPTUFQMzRYWF9TRFJDX0JBU0UJCTB4NkQwMDAwMDAKKworLyoKKyAqIEw0IFBlcmlwaGVyYWxzIC0gTDQgV2FrZXVwIGFuZCBMNCBDb3JlIG5vdworICovCisjZGVmaW5lIE9NQVAzNFhYX0NPUkVfTDRfSU9fQkFTRQkweDQ4MDAwMDAwCisKKyNkZWZpbmUgT01BUDM0WFhfV0FLRVVQX0w0X0lPX0JBU0UJMHg0ODMwMDAwMAorCisjZGVmaW5lIE9NQVAzNFhYX0w0X1BFUgkJCTB4NDkwMDAwMDAKKworI2RlZmluZSBPTUFQMzRYWF9MNF9JT19CQVNFCQlPTUFQMzRYWF9DT1JFX0w0X0lPX0JBU0UKKworLyogQ09OVFJPTCAqLworI2RlZmluZSBPTUFQMzRYWF9DVFJMX0JBU0UJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4MjAwMCkKKworLyogVEFQIGluZm9ybWF0aW9uICBkb250IGtub3cgZm9yIDM0MzAqLworI2RlZmluZSBPTUFQMzRYWF9UQVBfQkFTRQkJKDB4NDkwMDAwMDApIC8qZ2l2aW5nIHNvbWUganVuayBmb3IgdmlydGlvICovCisKKy8qIFVBUlQgKi8KKyNkZWZpbmUgT01BUDM0WFhfVUFSVDEJCQkoT01BUDM0WFhfTDRfSU9fQkFTRSsweDZhMDAwKQorI2RlZmluZSBPTUFQMzRYWF9VQVJUMgkJCShPTUFQMzRYWF9MNF9JT19CQVNFKzB4NmMwMDApCisjZGVmaW5lIE9NQVAzNFhYX1VBUlQzCQkJKE9NQVAzNFhYX0w0X1BFUisweDIwMDAwKQorCisvKiBHZW5lcmFsIFB1cnBvc2UgVGltZXJzICovCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEJCQkweDQ4MzE4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDIJCQkweDQ5MDMyMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDMJCQkweDQ5MDM0MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDQJCQkweDQ5MDM2MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDUJCQkweDQ5MDM4MDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDYJCQkweDQ5MDNBMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDcJCQkweDQ5MDNDMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDgJCQkweDQ5MDNFMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDkJCQkweDQ5MDQwMDAwCisjZGVmaW5lIE9NQVAzNFhYX0dQVDEwCQkJMHg0ODA4NjAwMAorI2RlZmluZSBPTUFQMzRYWF9HUFQxMQkJCTB4NDgwODgwMDAKKyNkZWZpbmUgT01BUDM0WFhfR1BUMTIJCQkweDQ4MzA0MDAwCisKKy8qIFdhdGNoRG9nIFRpbWVycyAoMSBzZWN1cmUsIDMgR1ApICovCisjZGVmaW5lIFdEMV9CQVNFCQkJKDB4NDgzMEMwMDApCisjZGVmaW5lIFdEMl9CQVNFCQkJKDB4NDgzMTQwMDApCisjZGVmaW5lIFdEM19CQVNFCQkJKDB4NDkwMzAwMDApCisKKy8qIDMyS1RJTUVSICovCisjZGVmaW5lIFNZTkNfMzJLVElNRVJfQkFTRQkJKDB4NDgzMjAwMDApCisjZGVmaW5lIFMzMktfQ1IJCQkJKFNZTkNfMzJLVElNRVJfQkFTRSsweDEwKQorCisvKgorICogU0RQMzQzMCBzcGVjaWZpYyBTZWN0aW9uCisgKi8KKworLyoKKyAqICBUaGUgMzQzeCdzIGNoaXAgc2VsZWN0cyBhcmUgcHJvZ3JhbW1hYmxlLiAgVGhlIG1hc2sgUk9NCisgKiAgZG9lcyBjb25maWd1cmUgQ1MwIHRvIDB4MDgwMDAwMDAgYmVmb3JlIGRpc3BhdGNoLiAgU28sIGlmCisgKiAgeW91IHdhbnQgeW91ciBjb2RlIHRvIGxpdmUgYmVsb3cgdGhhdCBhZGRyZXNzLCB5b3UgaGF2ZSB0bworICogIGJlIHByZXBhcmVkIHRvIGp1bXAgdGhvdWdoIGhvb3BzLCB0byByZXNldCB0aGUgYmFzZSBhZGRyZXNzLgorICogIFNhbWUgYXMgaW4gU0RQMzQzMAorICovCisjaWZkZWYgQ09ORklHX09NQVAzNFhYCisvKiBiYXNlIGFkZHJlc3MgZm9yIGluZGlyZWN0IHZlY3RvcnMgKGludGVybmFsIGJvb3QgbW9kZSkgKi8KKyNkZWZpbmUgU1JBTV9PRkZTRVQwCQkJMHg0MDAwMDAwMAorI2RlZmluZSBTUkFNX09GRlNFVDEJCQkweDAwMjAwMDAwCisjZGVmaW5lIFNSQU1fT0ZGU0VUMgkJCTB4MDAwMEY4MDAKKyNkZWZpbmUgU1JBTV9WRUNUX0NPREUJCQkoU1JBTV9PRkZTRVQwfFNSQU1fT0ZGU0VUMXxTUkFNX09GRlNFVDIpCisKKyNkZWZpbmUgTE9XX0xFVkVMX1NSQU1fU1RBQ0sJCTB4NDAyMEZGRkMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfMzQzMFNEUCkgfHwgZGVmaW5lZChDT05GSUdfT01BUDNFVk0pCisvKiBGUEdBIG9uIERlYnVnIGJvYXJkLiovCisjZGVmaW5lIEVUSF9DT05UUk9MX1JFRwkJCShERUJVR19CQVNFKzB4MzBiKQorI2RlZmluZSBMQU5fUkVTRVRfUkVHSVNURVIJCShERUJVR19CQVNFKzB4MWMpCisKKyNkZWZpbmUgRElQX1NXSVRDSF9JTlBVVF9SRUcyCQkoREVCVUdfQkFTRSsweDYwKQorI2RlZmluZSBMRURfUkVHSVNURVIJCQkoREVCVUdfQkFTRSsweDQwKQorI2RlZmluZSBGUEdBX1JFVl9SRUdJU1RFUgkJKERFQlVHX0JBU0UrMHgxMCkKKyNkZWZpbmUgRUVQUk9NX01BSU5fQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDE4MDApCisjZGVmaW5lIEVFUFJPTV9DT05OX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxOTAwKQorI2RlZmluZSBFRVBST01fVUlfQlJECQkJKERFQlVHX0JBU0UrMHgxMDAwMCsweDFBMDApCisjZGVmaW5lIEVFUFJPTV9NQ0FNX0JSRAkJCShERUJVR19CQVNFKzB4MTAwMDArMHgxQjAwKQorI2RlZmluZSBFTkhBTkNFRF9VSV9FRV9OQU1FCQkiNzUwLTIwNzUiCisjZW5kaWYKKworI2lmIGRlZmluZWQgKENPTkZJR19BTTM1MTdFVk0pIHx8IGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisvKiBFTUlGIDQgcmVwbGFjZXMgU0RSQyBpbiBBTTM1MTcgZm9yIEREUiAqLworI2RlZmluZSBFTUlGNF9NT0RfSUQJCQkweDAwCisjZGVmaW5lIEVNSUY0X1NUQVRVUwkJCTB4MDQKKyNkZWZpbmUgRU1JRjRfU0RSX0NPTkZJRwkJMHgwOAorI2RlZmluZSBFTUlGNF9MUEREUjJfQ09ORklGCQkweDBDCisjZGVmaW5lIEVNSUY0X1NEUl9SRUZfQ1RSTAkJMHgxMAorI2RlZmluZSBFTUlGNF9TRFJfUkVGX0NUUkxfU0hEVwkJMHgxNAorI2RlZmluZSBFTUlGNF9TRFJfVElNMQkJCTB4MTgKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTFfU0hEVwkJMHgxQworI2RlZmluZSBFTUlGNF9TRFJfVElNMiAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgRU1JRjRfU0RSX1RJTTJfU0hEVyAgICAgICAgICAgICAweDI0CisjZGVmaW5lIEVNSUY0X1NEUl9USU0zICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBFTUlGNF9TRFJfVElNM19TSERXICAgICAgICAgICAgIDB4MkMKKyNkZWZpbmUgRU1JRjRfTFBERFIyX05WTV9USU0JCTB4MzAKKyNkZWZpbmUgRU1JRjRfTFBERFIyX05WTV9USU1fU0hEVwkweDM0CisjZGVmaW5lIEVNSUY0X1BXUl9NR01UX0NUUkwJCTB4MzgKKyNkZWZpbmUgRU1JRjRfUFdSX01HTVRfQ1RSTF9TSERXCTB4M0MKKyNkZWZpbmUgRU1JRjRfTFBERFIyX1JFR19EQVRBCQkweDQwCisjZGVmaW5lIEVNSUY0X0xQRERSMl9SRUdfQ0ZHCQkweDUwCisjZGVmaW5lIEVNSUY0X09DUF9DT05GSUcJCTB4NTQKKyNkZWZpbmUgRU1JRjRfT0NQX0NGR19WQUwxCQkweDU4CisjZGVmaW5lIEVNSUY0X09DUF9DRkdfVkFMMgkJMHg1QworI2RlZmluZSBFTUlGNF9QRVJGX0NOVDEJCQkweDgwCisjZGVmaW5lIEVNSUY0X1BFUkZfQ05UMgkJCTB4ODQKKyNkZWZpbmUgRU1JRjRfUEVSRl9DTlRfQ0ZHCQkweDg4CisjZGVmaW5lIEVNSUY0X1BFUkZfQ05UX1NFTAkJMHg4QworI2RlZmluZSBFTUlGNF9QRVJGX0NOVF9USU0JCTB4OTAKKyNkZWZpbmUgRU1JRjRfSVJRX0VPSQkJCTB4QTAKKyNkZWZpbmUgRU1JRjRfSVJRU1RTX1JBVwkJMHhBNAorI2RlZmluZSBFTUlGNF9JUlFTVFMJCQkweEFDCisjZGVmaW5lIEVNSUY0X0lSUUVOX1NFVAkJCTB4QjQKKyNkZWZpbmUgRU1JRjRfSVJRRU5fQ0xSCQkJMHhCQworI2RlZmluZSBFTUlGNF9ERFJfUEhZX0NUUkwxCQkweEU0CisjZGVmaW5lIEVNSUY0X0REUl9QSFlfQ1RSTDFfU0hEVwkweEU4CisjZGVmaW5lIEVNSUY0X0REUl9QSFlfQ1RSTDIJCTB4RUMKKyNlbmRpZgorCisjZW5kaWYgIC8qIF9PTUFQMzQzMF9TWVNfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcHJjbS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9wcmNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwZmRhZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcHJjbS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTAgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHJlZ2lzdGVyIGFuZCByZWdpc3RlciBmaWVsZCBjb25zdGFudHMgYW5kCisgKiAgICAgIG1hY3JvcyBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIE9wZW4gTXVsdGltZWRpYSBBcHBsaWNhdGlvbgorICogICAgICBQbGF0Zm9ybSAoT01BUCkgMyBQb3dlciwgUmVzZXQgYW5kIENsb2NrIE1hbmFnZW1lbnQgKFBSQ00pCisgKiAgICAgIG1vZHVsZS4KKyAqLworCisjaWZuZGVmIF9PTUFQM19QUkNNX0gKKyNkZWZpbmUgX09NQVAzX1BSQ01fSAorCisjaW5jbHVkZSA8YXNtL2FyY2gvYml0cy5oPgorCisjZGVmaW5lIFBSQ01fQkFTRQkJCQkJCTB4NDgwMDAwMDAKKworI2RlZmluZSBQUkNNX0NNX0JBU0UJCQkJCQkoUFJDTV9CQVNFICsgMHgwMDAwNDAwMCkKKworI2RlZmluZSBQUkNNX1BSTV9CQVNFCQkJCQkJKFBSQ01fQkFTRSArIDB4MDAzMDYwMDApCisKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0JBU0UJCQkJCShQUkNNX1BSTV9CQVNFICsgMHgwMDAwMEQwMCkKKworI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMCQkJCQkJKFBSQ01fUFJNX0NDUl9CQVNFICsgMHgwMDAwMDA0MCkKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX1NUQVJUCQkwCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9CSVRTCQkzCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF9NQVNLCQlBUk1fUkVHX1ZBTCgwLCBBUk1fUkVHX01BU0soUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0JJVFMpKQorI2RlZmluZSBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBQUkNNX1BSTV9DQ1JfQ0xLU0VMX1NZU19DTEtJTl9TRUxfTUFTSywgdikKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgUFJDTV9QUk1fQ0NSX0NMS1NFTF9TWVNfQ0xLSU5fU0VMX01BU0ssIHYpCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xMl8wX01IWgkJMHgwCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xM18wX01IWgkJMHgxCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xOV8yX01IWgkJMHgyCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8yNl8wX01IWgkJMHgzCisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8zOF80X01IWgkJMHg0CisjZGVmaW5lIFBSQ01fUFJNX0NDUl9DTEtTRUxfU1lTX0NMS0lOX1NFTF8xNl84X01IWgkJMHg1CisKKyNkZWZpbmUgUFJDTV9QUk1fQ0NSX0NMS09VVF9DVFJMCQkJCShQUkNNX1BSTV9DQ1JfQkFTRSArIDB4MDAwMDAwNzApCisKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQkFTRQkJCQkJKFBSQ01fUFJNX0JBU0UgKyAweDAwMDAxMjAwKQorCisjZGVmaW5lCVBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMCQkJCQkoUFJDTV9QUk1fR1JfQkFTRSArIDB4MDAwMDAwNzApCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9TVEFSVAkJNgorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQklUUwkJMgorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfTUFTSwkJQVJNX1JFR19WQUwoMCwgQVJNX1JFR19NQVNLKFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9CSVRTKSkKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoMCwgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX01BU0ssIHYpCisjZGVmaW5lIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDAsIFBSQ01fUFJNX0dSX0NMS1NSQ19DVFJMX1NZU0NMS0RJVl9NQVNLLCB2KQorI2RlZmluZSBQUkNNX1BSTV9HUl9DTEtTUkNfQ1RSTF9TWVNDTEtESVZfQllfMQkJCTEKKyNkZWZpbmUgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkxfU1lTQ0xLRElWX0JZXzIJCQkyCisKKyNkZWZpbmUgUFJDTV9TUl9CQVNFCQkJCQkoUFJDTV9CQVNFICsgMHgwMDBDOTAwMCkKKworI2RlZmluZSBQUk1fQ0xLU0VMICAgICAgICAgICBQUkNNX1BSTV9DQ1JfQ0xLU0VMCisjZGVmaW5lIFBSTV9SU1RDVFJMICAgICAgICAgIDB4NDgzMDcyNTAKKyNkZWZpbmUgUFJNX0NMS1NSQ19DVFJMICAgICAgUFJDTV9QUk1fR1JfQ0xLU1JDX0NUUkwKKworI2VuZGlmIC8qIF9PTUFQM19QUkNNX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvcmV2LmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3Jldi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwZTk1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3Jldi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIAorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICogU3llZCBNb2hhbW1lZCBLaGFzaW0gPHgwa2hhc2ltQHRpLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9PTUFQMzRYWF9SRVZfSF8KKyNkZWZpbmUgX09NQVAzNFhYX1JFVl9IXworCisjZGVmaW5lIENEQl9ERFJfQ09NQk8gICAgICAgICAgICAgICAgICAgLyogY29tYm8gcGFydCBvbiBjcHUgZGF1Z2h0ZXIgY2FyZCAqLworI2RlZmluZSBDREJfRERSX0lQREIgICAgICAgICAgICAgICAgICAgIC8qIDJ4MTYgcGFydHMgb24gZGF1Z2h0ZXIgY2FyZCAqLworCisjZGVmaW5lIEREUl8xMDAJCTEwMCAgICAgICAgICAgICAvKiB0eXBlIGZvdW5kIG9uIG1vc3QgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xMTEJCTExMSAgICAgICAgICAgICAvKiBzb21lIGNvbWJvIHBhcnRzICovCisjZGVmaW5lIEREUl8xMzMJCTEzMyAgICAgICAgICAgICAvKiBtb3N0IGNvbWJvLCBzb21lIG1lbSBkLWJvYXJkcyAqLworI2RlZmluZSBERFJfMTY1CQkxNjUgICAgICAgICAgICAgLyogZnV0dXJlIHBhcnRzICovCisKKyNkZWZpbmUgQ1BVXzM0MzAJMHgzNDMwCisKKyNkZWZpbmUgQ1BVXzM0MzBfRVMxCTEKKyNkZWZpbmUgQ1BVXzM0MzBfRVMyCTEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NkcmMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2RyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTIwMWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3NkcmMuaApAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMCBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgcmVnaXN0ZXIgYW5kIHJlZ2lzdGVyIGZpZWxkIGNvbnN0YW50cyBhbmQKKyAqICAgICAgbWFjcm9zIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT3BlbiBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uCisgKiAgICAgIFBsYXRmb3JtIChPTUFQKSAzIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpLgorICovCisKKyNpZm5kZWYgX09NQVAzX1NEUkNfSAorI2RlZmluZSBfT01BUDNfU0RSQ19ICisKKyNpbmNsdWRlIDxhc20vYXJjaC9iaXRzLmg+CisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIFJldmlzaW9uCisgKi8KKyNkZWZpbmUgU0RSQ19SRVZJU0lPTl9SRVZfTUFTSwkJCQlBUk1fUkVHX1ZBTCgwLCAweEZGKQorI2RlZmluZSBTRFJDX1JFVklTSU9OX1JFVl9NQUpPUl9NQVNLCQlBUk1fUkVHX1ZBTCg0LCAweEYpCisjZGVmaW5lIFNEUkNfUkVWSVNJT05fUkVWX01JTk9SX01BU0sJCUFSTV9SRUdfVkFMKDAsIDB4RikKKyNkZWZpbmUgU0RSQ19SRVZJU0lPTl9SRVZfTUFKT1JfREVDT0RFKHgpCUFSTV9SRUdfVkFMX0RFQ09ERSg0LCBTRFJDX1JFVklTSU9OX1JFVl9NQUpPUl9NQVNLLCB4KQorI2RlZmluZSBTRFJDX1JFVklTSU9OX1JFVl9NSU5PUl9ERUNPREUoeCkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfUkVWSVNJT05fUkVWX01JTk9SX01BU0spLCB4KQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBTeXN0ZW0gQ29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHX05PTUVNT1JZTVJTX0RJU0FCTEUJQVJNX1JFR19WQUwoOCwgMCkKKyNkZWZpbmUgU0RSQ19TWVNDT05GSUdfTk9NRU1PUllNUlNfRU5BQkxFCUFSTV9SRUdfVkFMKDgsIDEpCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHX0lETEVNT0RFX1NNQVJUCQlBUk1fUkVHX1ZBTCgzLCAweDIpCisjZGVmaW5lIFNEUkNfU1lTQ09ORklHX1NPRlRSRVNFVF9DTEVBUgkJQVJNX1JFR19WQUwoMSwgMHgwKQorI2RlZmluZSBTRFJDX1NZU0NPTkZJR19TT0ZUUkVTRVRfU0VUCQlBUk1fUkVHX1ZBTCgxLCAweDEpCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIFN5c3RlbSBTdGF0dXMKKyAqLworI2RlZmluZSBTRFJDX1NZU1NUQVRVU19SRVNFVERPTkUJCQlBUk1fUkVHX1ZBTCgwLCAxKQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBDaGlwIFNlbGVjdCBDb25maWd1cmF0aW9uCisgKi8KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgTXVsdGlwbGV4aW5nCisgKi8KKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0xPQ0tfT0ZGCQkJCUFSTV9SRUdfVkFMKDMwLCAwKQorI2RlZmluZSBTRFJDX1NIQVJJTkdfTE9DS19PTgkJCQlBUk1fUkVHX1ZBTCgzMCwgMSkKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19NQVNLCQkJQVJNX1JFR19WQUwoMTIsIDB4NykKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDEyLCBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzFNVVhDRkdfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSgxMiwgU0RSQ19TSEFSSU5HX0NTMU1VWENGR19NQVNLLCB2KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzMyX0JJVF8zMV8wCQkweDAKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTMU1VWENGR18xNl9CSVRfMzFfMTYJCTB4MgorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MxTVVYQ0ZHXzE2X0JJVF8xNl8wCQkweDMKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR19NQVNLCQkJQVJNX1JFR19WQUwoOSwgMHg3KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0VOQ09ERSh2KQlBUk1fUkVHX1ZBTF9FTkNPREUoOSwgU0RSQ19TSEFSSU5HX0NTME1VWENGR19NQVNLLCB2KQorI2RlZmluZSBTRFJDX1NIQVJJTkdfQ1MwTVVYQ0ZHX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoOSwgU0RSQ19TSEFSSU5HX0NTME1VWENGR19NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR18zMl9CSVRfMzFfMAkJMHgwCisjZGVmaW5lIFNEUkNfU0hBUklOR19DUzBNVVhDRkdfMTZfQklUXzMxXzE2CQkweDIKKyNkZWZpbmUgU0RSQ19TSEFSSU5HX0NTME1VWENGR18xNl9CSVRfMTZfMAkJMHgzCisjZGVmaW5lIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT04JCUFSTV9SRUdfVkFMKDgsIDApCisjZGVmaW5lIFNEUkNfU0hBUklOR19TRFJDVFJJU1RBVEVfT0ZGCQlBUk1fUkVHX1ZBTCg4LCAxKQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBFcnJvciBBZGRyZXNzCisgKi8KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRXJyb3IgVHlwZQorICovCisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEREUiBBIEZpbmUgVHVuaW5nIENvbnRyb2wKKyAqLworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9GSVhFRF9ERUxBWV9NQVNLCQlBUk1fUkVHX1ZBTCgyNCwgMHhGRikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSgyNCwgU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfREVDT0RFKHYpCUFSTV9SRUdfVkFMX0RFQ09ERSgyNCwgU0RSQ19ETExBX0NUUkxfRklYRURfREVMQVlfTUFTSywgdikKKworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9NQVNLCQlBUk1fUkVHX1ZBTCgxNiwgMHhGRikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSgxNiwgU0RSQ19ETExBX0NUUkxfSU5JVF9MQVRfTUFTSywgdiAvIDIpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX0lOSVRfTEFUX0RFQ09ERSh2KQkoQVJNX1JFR19WQUxfREVDT0RFKDE2LCBTRFJDX0RMTEFfQ1RSTF9JTklUX0xBVF9NQVNLLCB2KSAqIDIpCisKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX01BU0sJQVJNX1JFR19WQUwoNSwgMHgzKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSg1LCBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoNSwgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfRExMQV9DVFJMX01PREVfT05fSURMRV9QV0QJCQkweDAKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTU9ERV9PTl9JRExFX0lETEUJCTB4MQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9NT0RFX09OX0lETEVfSUdOT1JFCQkweDIKKworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9JRExFX0RJU0FCTEUJCQlBUk1fUkVHX1ZBTCg0LCAwKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9JRExFX0VOQUJMRQkJCUFSTV9SRUdfVkFMKDQsIDEpCisKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfRExMX0RJU0FCTEUJCQlBUk1fUkVHX1ZBTCgzLCAwKQorI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9ETExfRU5BQkxFCQkJQVJNX1JFR19WQUwoMywgMSkKKworI2RlZmluZSBTRFJDX0RMTEFfQ1RSTF9MT0NLX1RSQUNLSU5HREVMQVkJQVJNX1JFR19WQUwoMiwgMCkKKyNkZWZpbmUgU0RSQ19ETExBX0NUUkxfTE9DS19GSVhFRERFTEFZCQlBUk1fUkVHX1ZBTCgyLCAxKQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBERFIgQSBGaW5lIFR1bmluZyBTdGF0dXMKKyAqLworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBQb3dlciBNYW5hZ2VtZW50IFBvbGljeQorICovCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfV0FLRVVQX0RFTEFZRUQJCUFSTV9SRUdfVkFMKDI2LCAwKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19XQUtFVVBfSU1NRUQJCQlBUk1fUkVHX1ZBTCgyNiwgMSkKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfTUFTSwkJQVJNX1JFR19WQUwoOCwgMHhGRkZGKQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSg4LCBTRFJDX1BPV0VSX1JFR19BVVRPQ09VTlRfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoOCwgU0RSQ19QT1dFUl9SRUdfQVVUT0NPVU5UX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1NSRlJfT05fUlNUX0RJU0FCTEUJQVJNX1JFR19WQUwoNywgMCkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9SU1RfRU5BQkxFCUFSTV9SRUdfVkFMKDcsIDEpCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0RJU0FCTEUJQVJNX1JFR19WQUwoNiwgMCkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfU1JGUl9PTl9JRExFX0VOQUJMRQlBUk1fUkVHX1ZBTCg2LCAxKQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTUFTSwkJCUFSTV9SRUdfVkFMKDQsIDB4MykKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9FTkNPREUodikJQVJNX1JFR19WQUxfRU5DT0RFKDQsIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9ERUNPREUodikJQVJNX1JFR19WQUxfREVDT0RFKDQsIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX0NMS0NUUkxfTk9ORQkJCQkweDAKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfQ0xLQ1RSTF9TRUxGX0dBVEUJCTB4MQorI2RlZmluZSBTRFJDX1BPV0VSX1JFR19DTEtDVFJMX1NFTEZfUkVGUkVTSAkJMHgyCisKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfRVhUQ0xLRElTX09OCQkJQVJNX1JFR19WQUwoMywgMSkKKyNkZWZpbmUgU0RSQ19QT1dFUl9SRUdfRVhUQ0xLRElTX09OCQkJQVJNX1JFR19WQUwoMywgMSkKKworI2RlZmluZSBTRFJDX1BPV0VSX1JFR19QV0RfRElTQUJMRQkJCUFSTV9SRUdfVkFMKDIsIDApCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1BXRF9FTkFCTEUJCQlBUk1fUkVHX1ZBTCgyLCAxKQorCisjZGVmaW5lIFNEUkNfUE9XRVJfUkVHX1BBR0VQT0xJQ1lfSFBIQgkJQVJNX1JFR19WQUwoMCwgMSkKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgTWVtb3J5IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBTRFJDX01DRkdfTE9DS1NUQVRVU19SVwkJCQlBUk1fUkVHX1ZBTCgzMCwgMCkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0xPQ0tTVEFUVVNfUk8JCQkJQVJNX1JFR19WQUwoMzAsIDEpCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIX01BU0sJCQkJQVJNX1JFR19WQUwoMjQsIDB4NykKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDI0LCBTRFJDX01DRkdfUkFTV0lEVEhfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDI0LCBTRFJDX01DRkdfUkFTV0lEVEhfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xMV9CSVRTCQkJCTB4MAorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTJfQklUUwkJCQkweDEKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzEzX0JJVFMJCQkJMHgyCisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xNF9CSVRTCQkJCTB4MworI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMTVfQklUUwkJCQkweDQKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBU1dJRFRIXzE2X0JJVFMJCQkJMHg1CisjZGVmaW5lIFNEUkNfTUNGR19SQVNXSURUSF8xN19CSVRTCQkJCTB4NgorI2RlZmluZSBTRFJDX01DRkdfUkFTV0lEVEhfMThfQklUUwkJCQkweDcKKworI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfTUFTSwkJCQlBUk1fUkVHX1ZBTCgyMCwgMHg3KQorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMjAsIFNEUkNfTUNGR19DQVNXSURUSF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMjAsIFNEUkNfTUNGR19DQVNXSURUSF9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzVfQklUUwkJCQkweDAKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzZfQklUUwkJCQkweDEKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzdfQklUUwkJCQkweDIKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzhfQklUUwkJCQkweDMKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzlfQklUUwkJCQkweDQKKyNkZWZpbmUgU0RSQ19NQ0ZHX0NBU1dJRFRIXzEwX0JJVFMJCQkJMHg1CisjZGVmaW5lIFNEUkNfTUNGR19DQVNXSURUSF8xMV9CSVRTCQkJCTB4NgorI2RlZmluZSBTRFJDX01DRkdfQ0FTV0lEVEhfMTJfQklUUwkJCQkweDcKKworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9NQVNLCQkJCUFSTV9SRUdfVkFMKDIwLCAweDFGKQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9FTkNPREUodikJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMjAsIFNEUkNfTUNGR19BRERSTVVYX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX0RFQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0RFQ09ERSgyMCwgU0RSQ19NQ0ZHX0FERFJNVVhfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzEgICAJCQkweDAKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzIgIAkJCTB4MQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMyAgCQkJMHgyCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV80ICAJCQkweDMKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzUgIAkJCTB4NAorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfNgkJCQkweDUKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzcJCQkJMHg2CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV84CQkJCTB4NworI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfOSAgIAkJCTB4OAorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTAgIAkJCTB4OQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTEgIAkJCTB4QQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTIgCQkJMHhCCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xMyAgCQkJMHhDCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8xNAkJCQkweEQKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzE1CQkJCTB4RQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMTYJCQkJMHhGCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yMyAgCQkJMHgxNgorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWF9TQ0hFTUVfMjQgIAkJCTB4MTcKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI1IAkJCTB4MTgKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhfU0NIRU1FXzI2ICAJCQkweDE5CisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yNwkJCQkweDFBCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yOAkJCQkweDFCCisjZGVmaW5lIFNEUkNfTUNGR19BRERSTVVYX1NDSEVNRV8yOQkJCQkweDFDCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0FERFJNVVhMRUdBQ1lfRklYRUQJCUFSTV9SRUdfVkFMKDE5LCAwKQorI2RlZmluZSBTRFJDX01DRkdfQUREUk1VWExFR0FDWV9GTEVYSUJMRQlBUk1fUkVHX1ZBTCgxOSwgMSkKKworI2RlZmluZSBTRFJDX01DRkdfUkFNU0laRV9NQVNLCQkJCUFSTV9SRUdfVkFMKDgsIDB4M0ZGKQorI2RlZmluZSBTRFJDX01DRkdfUkFNU0laRV9FTkNPREUodikJCQlBUk1fUkVHX1ZBTF9FTkNPREUoOCwgU0RSQ19NQ0ZHX1JBTVNJWkVfTUFTSywgKCh2KSAvIDIpKQorI2RlZmluZSBTRFJDX01DRkdfUkFNU0laRV9ERUNPREUodikJCQkoQVJNX1JFR19WQUxfREVDT0RFKDgsIFNEUkNfTUNGR19SQU1TSVpFX01BU0ssIHYpICogMikKKworI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fTUFTSwkJQVJNX1JFR19WQUwoNiwgMHgzKQorI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fRU5DT0RFKHYpCUFSTV9SRUdfVkFMX0VOQ09ERSg2LCBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0RFQ09ERSh2KQlBUk1fUkVHX1ZBTF9ERUNPREUoNiwgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX01BU0spLCB2KQorI2RlZmluZSBTRFJDX01DRkdfQkFOS0FMTE9DQVRJT05fQl9SX0MJCQkweDAKKyNkZWZpbmUgU0RSQ19NQ0ZHX0JBTktBTExPQ0FUSU9OX0IxX1JfQjBfQwkJMHgxCisjZGVmaW5lIFNEUkNfTUNGR19CQU5LQUxMT0NBVElPTl9SX0JfQwkJCTB4MgorCisjZGVmaW5lIFNEUkNfTUNGR19CMzJOT1QxNl9PRkYJCQkJQVJNX1JFR19WQUwoNCwgMCkKKyNkZWZpbmUgU0RSQ19NQ0ZHX0IzMk5PVDE2X09OCQkJCUFSTV9SRUdfVkFMKDQsIDEpCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX0RFRVBQRF9VTlNVUFBPUlRFRAkJQVJNX1JFR19WQUwoMywgMCkKKyNkZWZpbmUJU0RSQ19NQ0ZHX0RFRVBQRF9TVVBQT1JURUQJCQlBUk1fUkVHX1ZBTCgzLCAxKQorCisjZGVmaW5lIFNEUkNfTUNGR19ERFJUWVBFX01BU0sJCQkJQVJNX1JFR19WQUwoMiwgMHgxKQorI2RlZmluZSBTRFJDX01DRkdfRERSVFlQRV9FTkNPREUodikJCQlBUk1fUkVHX1ZBTF9FTkNPREUoMiwgU0RSQ19NQ0ZHX0REUlRZUEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX0REUlRZUEVfREVDT0RFKHYpCQkJQVJNX1JFR19WQUxfREVDT0RFKDIsIFNEUkNfTUNGR19ERFJUWVBFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUNGR19ERFJUWVBFX01PQklMRV9ERFIJCQkwCisKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVRZUEVfTUFTSwkJCQlBUk1fUkVHX1ZBTCgwLCAweDMpCisjZGVmaW5lIFNEUkNfTUNGR19SQU1UWVBFX0VOQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX01DRkdfUkFNVFlQRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01DRkdfUkFNVFlQRV9ERUNPREUodikJCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19NQ0ZHX1JBTVRZUEVfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVRZUEVfU0RSCQkJCQkweDAKKyNkZWZpbmUgU0RSQ19NQ0ZHX1JBTVRZUEVfRERSCQkJCQkweDEKKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgRERSIE1vZGUgUmVnaXN0ZXIgKENvcnJlc3BvbmRzIDE6MSB3LyBKRURFQyBNb2RlCisgKiBSZWdpc3RlcikKKyAqLworCisjZGVmaW5lIFNEUkNfTVJfWkVST18xCQkJCQkJQVJNX1JFR19WQUwoMTAsIDApCisKKyNkZWZpbmUgU0RSQ19NUl9XQlNUX0VOQUJMRQkJCQkJQVJNX1JFR19WQUwoOSwgMCkKKyNkZWZpbmUgU0RSQ19NUl9XQlNUX0RJU0FCTEUJCQkJQVJNX1JFR19WQUwoOSwgMSkKKworI2RlZmluZSBTRFJDX01SX1pFUk9fMAkJCQkJCUFSTV9SRUdfVkFMKDcsIDApCisKKyNkZWZpbmUgU0RSQ19NUl9DQVNMX01BU0sJCQkJCUFSTV9SRUdfVkFMKDQsIDB4NykKKyNkZWZpbmUgU0RSQ19NUl9DQVNMX0VOQ09ERSh2KQkJCQlBUk1fUkVHX1ZBTF9FTkNPREUoNCwgU0RSQ19NUl9DQVNMX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF9ERUNPREUodikJCQkJQVJNX1JFR19WQUxfREVDT0RFKDQsIFNEUkNfTVJfQ0FTTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX01SX0NBU0xfMQkJCQkJCQkweDEKKyNkZWZpbmUgU0RSQ19NUl9DQVNMXzIJCQkJCQkJMHgyCisjZGVmaW5lIFNEUkNfTVJfQ0FTTF8zCQkJCQkJCTB4MworI2RlZmluZSBTRFJDX01SX0NBU0xfNAkJCQkJCQkweDQKKyNkZWZpbmUgU0RSQ19NUl9DQVNMXzUJCQkJCQkJMHg1CisKKyNkZWZpbmUgU0RSQ19NUl9TSUxfU0VSSUFMCQkJCQlBUk1fUkVHX1ZBTCgzLCAwKQorI2RlZmluZSBTRFJDX01SX1NJTF9JTlRFUkxFQVZFRAkJCQlBUk1fUkVHX1ZBTCgzLCAxKQorCisjZGVmaW5lIFNEUkNfTVJfQkxfTUFTSwkJCQkJCUFSTV9SRUdfVkFMKDAsIDB4NykKKyNkZWZpbmUgU0RSQ19NUl9CTF9FTkNPREUodikJCQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfTVJfQkxfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NUl9CTF9ERUNPREUodikJCQkJQVJNX1JFR19WQUxfREVDT0RFKDAsIFNEUkNfTVJfQkxfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NUl9CTF8xCQkJCQkJCTB4MAorI2RlZmluZSBTRFJDX01SX0JMXzIJCQkJCQkJMHgxCisjZGVmaW5lIFNEUkNfTVJfQkxfNAkJCQkJCQkweDIKKyNkZWZpbmUgU0RSQ19NUl9CTF84CQkJCQkJCTB4MworI2RlZmluZSBTRFJDX01SX0JMX0ZVTExfUEFHRQkJCQkJMHg3CisKKy8qCisgKiBTRFJBTSBDb250cm9sbGVyIEREUiBFeHRlbmRlZCBNb2RlIFJlZ2lzdGVyIChDb3JyZXNwb25kcyAxOjEgdy8KKyAqIEpFREVDIE1vZGUgUmVnaXN0ZXIpCisgKi8KKworLyoKKyAqIFNEUkFNIENvbnRyb2xsZXIgQUMgVGltaW5nIENvbnRyb2wgQQorICovCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19NQVNLCQkJQVJNX1JFR19WQUwoMjcsIDB4MUYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgyNywgU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJGQ19ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgyNywgU0RSQ19BQ1RJTV9DVFJMQV9UUkZDX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX01BU0sJCQlBUk1fUkVHX1ZBTCgyMiwgMHgxRikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMjIsIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDIyLCBTRFJDX0FDVElNX0NUUkxBX1RSQ19NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSQVNfTUFTSwkJCUFSTV9SRUdfVkFMKDE4LCAweEYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxOCwgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJBU19ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxOCwgU0RSQ19BQ1RJTV9DVFJMQV9UUkFTX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX01BU0sJCQlBUk1fUkVHX1ZBTCgxNSwgMHg3KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1RSUF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxNSwgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlBfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTUsIFNEUkNfQUNUSU1fQ1RSTEFfVFJQX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJDRF9NQVNLCQkJQVJNX1JFR19WQUwoMTIsIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDEyLCBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUkNEX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDEyLCBTRFJDX0FDVElNX0NUUkxBX1RSQ0RfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX01BU0sJCQlBUk1fUkVHX1ZBTCg5LCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSg5LCBTRFJDX0FDVElNX0NUUkxBX1RSUkRfTUFTSywgdikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UUlJEX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDksIFNEUkNfQUNUSU1fQ1RSTEFfVFJSRF9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REUExfTUFTSwkJCUFSTV9SRUdfVkFMKDYsIDB4NykKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDYsIFNEUkNfQUNUSU1fQ1RSTEFfVERQTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REUExfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoNiwgU0RSQ19BQ1RJTV9DVFJMQV9URFBMX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9NQVNLCQkJQVJNX1JFR19WQUwoMCwgMHgxRikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfQUNUSU1fQ1RSTEFfVERBTF9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxBX1REQUxfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19BQ1RJTV9DVFJMQV9UREFMX01BU0spLCB2KQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBBQyBUaW1pbmcgQ29udHJvbCBCCisgKi8KKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UV1RSX01BU0sJCQlBUk1fUkVHX1ZBTCgxNiwgMHgzKQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RXVFJfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoMTYsIFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RXVFJfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTYsIFNEUkNfQUNUSU1fQ1RSTEJfVFdUUl9NQVNLKSwgdikKKworI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RDS0VfTUFTSwkJCUFSTV9SRUdfVkFMKDEyLCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxMiwgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVENLRV9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSgxMiwgU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX01BU0sJCQlBUk1fUkVHX1ZBTCg4LCAweDcpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDgsIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX0RFQ09ERSh2KQkJQVJNX1JFR19WQUxfREVDT0RFKDgsIFNEUkNfQUNUSU1fQ1RSTEJfVFhQX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9NQVNLCQkJQVJNX1JFR19WQUwoMCwgMHhGRikKKyNkZWZpbmUgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX0VOQ09ERSh2KQkJQVJNX1JFR19WQUxfRU5DT0RFKDAsIFNEUkNfQUNUSU1fQ1RSTEJfVFhTUl9NQVNLLCB2KQorI2RlZmluZSBTRFJDX0FDVElNX0NUUkxCX1RYU1JfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19BQ1RJTV9DVFJMQl9UWFNSX01BU0spLCB2KQorCisvKgorICogU0RSQU0gQ29udHJvbGxlciBBdXRvcmVmcmVzaCBDb250cm9sCisgKi8KKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkNWX01BU0sJCQkJQVJNX1JFR19WQUwoOCwgMHhGRkZGKQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSQ1ZfRU5DT0RFKHYpCQlBUk1fUkVHX1ZBTF9FTkNPREUoOCwgU0RSQ19SRlJfQ1RSTF9BUkNWX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJDVl9ERUNPREUodikJCUFSTV9SRUdfVkFMX0RFQ09ERSg4LCBTRFJDX1JGUl9DVFJMX0FSQ1ZfTUFTSyksIHYpCisKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfTUFTSwkJCQlBUk1fUkVHX1ZBTCgwLCAweDMpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFX0VOQ09ERSh2KQkJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX1JGUl9DVFJMX0FSRV9NQVNLLCB2KQorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV9ERUNPREUodikJCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19SRlJfQ1RSTF9BUkVfTUFTSyksIHYpCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFX0RJU0FCTEVECQkJCTB4MAorI2RlZmluZSBTRFJDX1JGUl9DVFJMX0FSRV8xX0FSQ1YJCQkJMHgxCisjZGVmaW5lIFNEUkNfUkZSX0NUUkxfQVJFXzRfQVJDVgkJCQkweDIKKyNkZWZpbmUgU0RSQ19SRlJfQ1RSTF9BUkVfOF9BUkNWCQkJCTB4MworCisvKgorICogU0RSQU0gQ29udHJvbGxlciBNYW51YWwgQ29udHJvbAorICovCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRFBBUkFNX01BU0sJCQlBUk1fUkVHX1ZBTCgxNiwgMHhGRkZGKQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURQQVJBTV9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgxNiwgU0RSQ19NQU5VQUxfQ01EUEFSQU1fTUFTSywgdikKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EUEFSQU1fREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMTYsIFNEUkNfTUFOVUFMX0NNRFBBUkFNX01BU0spLCB2KQorCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfTUFTSwkJCUFSTV9SRUdfVkFMKDAsIDB4NykKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9FTkNPREUodikJCUFSTV9SRUdfVkFMX0VOQ09ERSgwLCBTRFJDX01BTlVBTF9DTURDT0RFX01BU0ssIHYpCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfREVDT0RFKHYpCQlBUk1fUkVHX1ZBTF9ERUNPREUoMCwgU0RSQ19NQU5VQUxfQ01EQ09ERV9NQVNLKSwgdikKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9OT1AJCQkJCTB4MAorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX1BSRUNIQVJHRV9BTEwJCTB4MQorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX0FVVE9SRUZSRVNICQkJMHgyCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfRU5URVJfUFdECQkJMHgzCisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfRVhJVF9QV0QJCQkweDQKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9FTlRFUl9TRUxGUkVGUkVTSAkweDUKKyNkZWZpbmUgU0RSQ19NQU5VQUxfQ01EQ09ERV9FWElUX1NFTEZSRUZSRVNICTB4NgorI2RlZmluZSBTRFJDX01BTlVBTF9DTURDT0RFX1NFVF9DS0VfSElHSAkJMHg3CisjZGVmaW5lIFNEUkNfTUFOVUFMX0NNRENPREVfU0VUX0NLRV9MT1cJCQkweDgKKworI2VuZGlmIC8qIF9PTUFQM19TRFJDX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2l6ZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2FyY2gtb21hcDMvc2l6ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJhMThmCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zaXplcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNwkgVVNBCisgKi8KKy8qICBTaXplIGRlZmludGlvbnMKKyAqICBDb3B5cmlnaHQgKEMpIEFSTSBMaW1pdGVkIDE5OTguIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKworI2lmbmRlZiBfX3NpemVzX2gKKyNkZWZpbmUgX19zaXplc19oCQkJMQorCisvKiBoYW5keSBzaXplcyAqLworI2RlZmluZSBTWl8xSwkJCQkweDAwMDAwNDAwCisjZGVmaW5lIFNaXzRLCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgU1pfOEsJCQkJMHgwMDAwMjAwMAorI2RlZmluZSBTWl8xNksJCQkJMHgwMDAwNDAwMAorI2RlZmluZSBTWl8zMksJCQkJMHgwMDAwODAwMAorI2RlZmluZSBTWl82NEsJCQkJMHgwMDAxMDAwMAorI2RlZmluZSBTWl8xMjhLCQkJCTB4MDAwMjAwMDAKKyNkZWZpbmUgU1pfMjU2SwkJCQkweDAwMDQwMDAwCisjZGVmaW5lIFNaXzUxMksJCQkJMHgwMDA4MDAwMAorCisjZGVmaW5lIFNaXzFNCQkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgU1pfMk0JCQkJMHgwMDIwMDAwMAorI2RlZmluZSBTWl80TQkJCQkweDAwNDAwMDAwCisjZGVmaW5lIFNaXzhNCQkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgU1pfMTZNCQkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgU1pfMzFNCQkJCTB4MDFGMDAwMDAKKyNkZWZpbmUgU1pfMzJNCQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgU1pfNjRNCQkJCTB4MDQwMDAwMDAKKyNkZWZpbmUgU1pfMTI4TQkJCQkweDA4MDAwMDAwCisjZGVmaW5lIFNaXzI1Nk0JCQkJMHgxMDAwMDAwMAorI2RlZmluZSBTWl81MTJNCQkJCTB4MjAwMDAwMDAKKworI2RlZmluZSBTWl8xRwkJCQkweDQwMDAwMDAwCisjZGVmaW5lIFNaXzJHCQkJCTB4ODAwMDAwMDAKKworI2VuZGlmCS8qIF9fc2l6ZXNfaCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfaW5mby5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTVkZDAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19pbmZvLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogVGV4YXMgSW5zdHJ1bWVudHMsIDx3d3cudGkuY29tPgorICogUmljaGFyZCBXb29kcnVmZiA8ci13b29kcnVmZjJAdGkuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX09NQVAzNFhYX1NZU19JTkZPX0hfCisjZGVmaW5lIF9PTUFQMzRYWF9TWVNfSU5GT19IXworCisjZGVmaW5lIFhEUl9QT1AJCTUgICAgICAvKiBwYWNrYWdlIG9uIHBhY2thZ2UgcGFydCAqLworI2RlZmluZSBTRFJfRElTQ1JFVEUJNCAgICAgIC8qIDEyOE0gbWVtb3J5IFNEUiBtb2R1bGUqLworI2RlZmluZSBERFJfU1RBQ0tFRAkzICAgICAgLyogc3RhY2tlZCBwYXJ0IG9uIDI0MjIgKi8KKyNkZWZpbmUgRERSX0NPTUJPCTIgICAgICAvKiBjb21ibyBwYXJ0IG9uIGNwdSBkYXVnaHRlciBjYXJkIChtZW5hbGFldXMpICovCisjZGVmaW5lIEREUl9ESVNDUkVURQkxICAgICAgLyogMngxNiBwYXJ0cyBvbiBkYXVnaHRlciBjYXJkICovCisKKyNkZWZpbmUgRERSXzEwMAkJMTAwICAgIC8qIHR5cGUgZm91bmQgb24gbW9zdCBtZW0gZC1ib2FyZHMgKi8KKyNkZWZpbmUgRERSXzExMQkJMTExICAgIC8qIHNvbWUgY29tYm8gcGFydHMgKi8KKyNkZWZpbmUgRERSXzEzMwkJMTMzICAgIC8qIG1vc3QgY29tYm8sIHNvbWUgbWVtIGQtYm9hcmRzICovCisjZGVmaW5lIEREUl8xNjUJCTE2NSAgICAvKiBmdXR1cmUgcGFydHMgKi8KKworI2RlZmluZSBDUFVfMzQzMAkweDM0MzAKKworLyogMzQzeCByZWFsIGhhcmR3YXJlOgorICogIEVTMSAgICAgPSByZXYgMAorICovCisKKy8qIDM0M3ggY29kZSBkZWZpbmVzOgorICogRVMxICAgICA9IDArMSA9IDEKKyAqIEVTMSAgICAgPSAxKzEgPSAxCisgKi8KKyNkZWZpbmUgQ1BVXzM0MzBfRVMxCQkxCisjZGVmaW5lIENQVV8zNDMwX0VTMgkJMgorCisvKgorICogSGF3a2V5ZSB2YWx1ZXMKKyAqLworI2RlZmluZSBIQVdLRVlFX09NQVAzNFhYICAgICAgICAweGI3YWUKKyNkZWZpbmUgSEFXS0VZRV9BTTM1WFggICAgICAgICAgMHhiODY4CisjZGVmaW5lIEhBV0tFWUVfT01BUDM2WFggICAgICAgIDB4Yjg5MQorCisjZGVmaW5lIEhBV0tFWUVfU0hJRlQgICAgICAgICAgIDEyCisKKy8qCisgKiBEZWZpbmUgQ1BVIGZhbWlsaWVzCisgKi8KKyNkZWZpbmUgQ1BVX09NQVAzNFhYICAgICAgICAgICAgMHgzNDAwICAvKiBPTUFQMzR4eC9PTUFQMzUgZGV2aWNlcyAqLworI2RlZmluZSBDUFVfQU0zNVhYICAgICAgICAgICAgICAweDM1MDAgIC8qIEFNMzV4eCBkZXZpY2VzICAgICAgICAgICovCisjZGVmaW5lIENQVV9PTUFQMzZYWCAgICAgICAgICAgIDB4MzYwMCAgLyogT01BUDM2eHggZGV2aWNlcyAgICAgICAgKi8KKworLyogQ3VycmVudGx5IFZpcnRpbyBtb2RlbHMgdGhpcyBvbmUgKi8KKyNkZWZpbmUgQ1BVXzM0MzBfQ0hJUElECQkweDBCNjhBMDAwCisKKyNkZWZpbmUgR1BNQ19NVVhFRAkJMQorI2RlZmluZSBHUE1DX05PTk1VWEVECQkwCisKKyNkZWZpbmUgVFlQRV9OQU5ECQkweDgwMAkvKiBiaXQgcG9zIGZvciBuYW5kIGluIGdwbWMgcmVnICovCisjZGVmaW5lIFRZUEVfTk9SCQkweDAwMAorI2RlZmluZSBUWVBFX09ORU5BTkQJCTB4ODAwCisKKyNkZWZpbmUgV0lEVEhfOEJJVAkJMHgwMDAwCisjZGVmaW5lIFdJRFRIXzE2QklUCQkweDEwMDAJLyogYml0IHBvcyBmb3IgMTYgYml0IGluIGdwbWMgKi8KKworI2RlZmluZSBJMkNfTUVORUxBVVMJCTB4NzIJLyogaTJjIGlkIGZvciBjb21wYW5pb24gY2hpcCAqLworI2RlZmluZSBJMkNfVFJJVE9OMgkJMHg0QgkvKiBhZGRyZXMgb2YgcG93ZXIgZ3JvdXAgKi8KKworI2RlZmluZSBCT09UX0ZBU1RfWElQCQkweDFmCisKKy8qIFNEUCBkZWZpbml0aW9ucyBhY2NvcmRpbmcgdG8gRlBHQSBSZXYuIElzIHRoaXMgT0s/PyAqLworI2RlZmluZSBTRFBfMzQzMF9WMQkJMHgxCisjZGVmaW5lIFNEUF8zNDMwX1YyCQkweDIKKworI2RlZmluZSBCT0FSRF8zNDMwX0xBQlJBRE9SCTB4ODAKKyNkZWZpbmUgQk9BUkRfMzQzMF9MQUJSQURPUl9WMQkweDEKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hcmNoLW9tYXAzL3N5c19wcm90by5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODBmYjIwCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vYXJjaC1vbWFwMy9zeXNfcHJvdG8uaApAQCAtMCwwICsxLDU5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDYKKyAqIFRleGFzIEluc3RydW1lbnRzLCA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgL1BVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgICovCisjaWZuZGVmIF9PTUFQMzRYWF9TWVNfUFJPVE9fSF8KKyNkZWZpbmUgX09NQVAzNFhYX1NZU19QUk9UT19IXworCit2b2lkIHByY21faW5pdCh2b2lkKTsKK3ZvaWQgcGVyX2Nsb2Nrc19lbmFibGUodm9pZCk7CisKK3ZvaWQgbWVtaWZfaW5pdCh2b2lkKTsKK3ZvaWQgc2RyY19pbml0KHZvaWQpOwordm9pZCBkb19zZHJjX2luaXQodTMyLHUzMik7Cit2b2lkIGdwbWNfaW5pdCh2b2lkKTsKKwordm9pZCBldGhlcl9pbml0KHZvaWQpOwordm9pZCB3YXRjaGRvZ19pbml0KHZvaWQpOwordm9pZCBzZXRfbXV4Y29uZl9yZWdzKHZvaWQpOwordTMyIGlzX2NwdV9mYW1pbHkodm9pZCk7Cit1MzIgZ2V0X2NwdV90eXBlKHZvaWQpOwordTMyIGdldF9jcHVfcmV2KHZvaWQpOwordTMyIGNwdV9pc18zNDEwKHZvaWQpOwordTMyIGdldF9tZW1fdHlwZSh2b2lkKTsKK3UzMiBnZXRfc3lzYm9vdF92YWx1ZSh2b2lkKTsKK3UzMiBnZXRfZ3BtYzBfYmFzZSh2b2lkKTsKK3UzMiBpc19ncG1jX211eGVkKHZvaWQpOwordTMyIGdldF9ncG1jMF90eXBlKHZvaWQpOwordTMyIGdldF9ncG1jMF93aWR0aCh2b2lkKTsKK3UzMiBnZXRfYm9hcmRfdHlwZSh2b2lkKTsKK3ZvaWQgZGlzcGxheV9ib2FyZF9pbmZvKHUzMik7Cit2b2lkIHVwZGF0ZV9tdXgodTMyLHUzMik7Cit1MzIgZ2V0X3Nkcl9jc19zaXplKHUzMiBvZmZzZXQpOwordTMyIHJ1bm5pbmdfaW5fc2RyYW0odm9pZCk7Cit1MzIgcnVubmluZ19pbl9zcmFtKHZvaWQpOwordTMyIHJ1bm5pbmdfaW5fZmxhc2godm9pZCk7Cit1MzIgcnVubmluZ19mcm9tX2ludGVybmFsX2Jvb3Qodm9pZCk7Cit1MzIgZ2V0X2RldmljZV90eXBlKHZvaWQpOworCit2b2lkIHNyMzIodTMyIGFkZHIsIHUzMiBzdGFydF9iaXQsIHUzMiBudW1fYml0cywgdTMyIHZhbHVlKTsKK3UzMiB3YWl0X29uX3ZhbHVlKHUzMiByZWFkX2JpdF9tYXNrLCB1MzIgbWF0Y2hfdmFsdWUsIHUzMiByZWFkX2FkZHIsIHUzMiBib3VuZCk7Cit2b2lkIHNkZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2F0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWU0YjcKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXRvbWljLmgKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk2IFJ1c3NlbGwgS2luZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDaGFuZ2Vsb2c6CisgKiAgIDI3LTA2LTE5OTYJUk1LCUNyZWF0ZWQKKyAqICAgMTMtMDQtMTk5NwlSTUsJTWFkZSBmdW5jdGlvbnMgYXRvbWljIQorICogICAwNy0xMi0xOTk3CVJNSwlVcGdyYWRlZCBmb3IgdjIuMS4KKyAqICAgMjYtMDgtMTk5OAlQSkIJQWRkZWQgI2lmZGVmIF9fS0VSTkVMX18KKyAqLworI2lmbmRlZiBfX0FTTV9BUk1fQVRPTUlDX0gKKyNkZWZpbmUgX19BU01fQVJNX0FUT01JQ19ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciBTTVAgbm90IHN1cHBvcnRlZAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJeyAoaSkgfQorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9wcm9jL3N5c3RlbS5oPgorCisjZGVmaW5lIGF0b21pY19yZWFkKHYpCSgodiktPmNvdW50ZXIpCisjZGVmaW5lIGF0b21pY19zZXQodixpKQkoKCh2KS0+Y291bnRlcikgPSAoaSkpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfYWRkKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXYtPmNvdW50ZXIgKz0gaTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3ViKGludCBpLCB2b2xhdGlsZSBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXYtPmNvdW50ZXIgLT0gaTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfaW5jKHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdi0+Y291bnRlciArPSAxOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19kZWModm9sYXRpbGUgYXRvbWljX3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2LT5jb3VudGVyIC09IDE7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfZGVjX2FuZF90ZXN0KHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2YWwgPSB2LT5jb3VudGVyOworCXYtPmNvdW50ZXIgPSB2YWwgLT0gMTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gdmFsID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfbmVnYXRpdmUoaW50IGksIHZvbGF0aWxlIGF0b21pY190ICp2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl2YWwgPSB2LT5jb3VudGVyOworCXYtPmNvdW50ZXIgPSB2YWwgKz0gaTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gdmFsIDwgMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaywgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSphZGRyICY9IH5tYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgb24gQVJNICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCkJYmFycmllcigpCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJYmFycmllcigpCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2J5dGVvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzNDg5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9ieXRlb3JkZXIuaAorICoKKyAqIEFSTSBFbmRpYW4tbmVzcy4gIEluIGxpdHRsZSBlbmRpYW4gbW9kZSwgdGhlIGRhdGEgYnVzIGlzIGNvbm5lY3RlZCBzdWNoCisgKiB0aGF0IGJ5dGUgYWNjZXNzZXMgYXBwZWFyIGFzOgorICogIDAgPSBkMC4uLmQ3LCAxID0gZDguLi5kMTUsIDIgPSBkMTYuLi5kMjMsIDMgPSBkMjQuLi5kMzEKKyAqIGFuZCB3b3JkIGFjY2Vzc2VzIChkYXRhIG9yIGluc3RydWN0aW9uKSBhcHBlYXIgYXM6CisgKiAgZDAuLi5kMzEKKyAqCisgKiBXaGVuIGluIGJpZyBlbmRpYW4gbW9kZSwgYnl0ZSBhY2Nlc3NlcyBhcHBlYXIgYXM6CisgKiAgMCA9IGQyNC4uLmQzMSwgMSA9IGQxNi4uLmQyMywgMiA9IGQ4Li4uZDE1LCAzID0gZDAuLi5kNworICogYW5kIHdvcmQgYWNjZXNzZXMgKGRhdGEgb3IgaW5zdHJ1Y3Rpb24pIGFwcGVhciBhczoKKyAqICBkMC4uLmQzMQorICovCisjaWZuZGVmIF9fQVNNX0FSTV9CWVRFT1JERVJfSAorI2RlZmluZSBfX0FTTV9BUk1fQllURU9SREVSX0gKKworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmZGVmIF9fQVJNRUJfXworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9iaWdfZW5kaWFuLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9jb25maWcuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Zjk4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2FzbS9jb25maWcuaApAQCAtMCwwICsxLDIyIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpZm5kZWYgX0FTTV9DT05GSUdfSF8KKyNkZWZpbmUgX0FTTV9DT05GSUdfSF8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS9pby5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE1MThlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vaW8uaApAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vaW8uaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgMTYtU2VwLTE5OTYJUk1LCUlubGluZWQgdGhlIGlueC9vdXR4IGZ1bmN0aW9ucyAmIG9wdGltaXNlZCBmb3IgYm90aAorICoJCQljb25zdGFudCBhZGRyZXNzZXMgYW5kIHZhcmlhYmxlIGFkZHJlc3Nlcy4KKyAqICAwNC1EZWMtMTk5NwlSTUsJTW92ZWQgYSBsb3Qgb2YgdGhpcyBzdHVmZiB0byB0aGUgbmV3IGFyY2hpdGVjdHVyZQorICoJCQlzcGVjaWZpYyBJTyBoZWFkZXIgZmlsZXMuCisgKiAgMjctTWFyLTE5OTkJUEpCCVNlY29uZCBwYXJhbWV0ZXIgb2YgbWVtY3B5X3RvaW8gaXMgY29uc3QuLgorICogIDA0LUFwci0xOTk5CVBKQglBZGRlZCBjaGVja19zaWduYXR1cmUuCisgKiAgMTItRGVjLTE5OTkJUk1LCU1vcmUgY2xlYW51cHMKKyAqICAxOC1KdW4tMjAwMCBSTUsJUmVtb3ZlZCB2aXJ0X3RvXyogYW5kIGZyaWVuZHMgZGVmaW5pdGlvbnMKKyAqLworI2lmbmRlZiBfX0FTTV9BUk1fSU9fSAorI2RlZmluZSBfX0FTTV9BUk1fSU9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgorI2lmIDAJLyogWFhYIyMjWFhYICovCisjaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KKyNlbmRpZgkvKiBYWFgjIyNYWFggKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN5bmModm9pZCkKK3sKK30KKworLyoKKyAqIEdpdmVuIGEgcGh5c2ljYWwgYWRkcmVzcyBhbmQgYSBsZW5ndGgsIHJldHVybiBhIHZpcnR1YWwgYWRkcmVzcworICogdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG1lbW9yeSByYW5nZSB3aXRoIHRoZSBjYWNoaW5nCisgKiBwcm9wZXJ0aWVzIHNwZWNpZmllZCBieSAiZmxhZ3MiLgorICovCisjZGVmaW5lIE1BUF9OT0NBQ0hFCSgwKQorI2RlZmluZSBNQVBfV1JDT01CSU5FCSgwKQorI2RlZmluZSBNQVBfV1JCQUNLCSgwKQorI2RlZmluZSBNQVBfV1JUSFJPVUdICSgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgKgorbWFwX3BoeXNtZW0ocGh5c19hZGRyX3QgcGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAodm9pZCAqKXBhZGRyOworfQorCisvKgorICogVGFrZSBkb3duIGEgbWFwcGluZyBzZXQgdXAgYnkgbWFwX3BoeXNtZW0oKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVubWFwX3BoeXNtZW0odm9pZCAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisKK30KKworc3RhdGljIGlubGluZSBwaHlzX2FkZHJfdCB2aXJ0X3RvX3BoeXModm9pZCAqIHZhZGRyKQoreworCXJldHVybiAocGh5c19hZGRyX3QpKHZhZGRyKTsKK30KKworLyoKKyAqIEdlbmVyaWMgdmlydHVhbCByZWFkL3dyaXRlLiAgTm90ZSB0aGF0IHdlIGRvbid0IHN1cHBvcnQgaGFsZi13b3JkCisgKiByZWFkL3dyaXRlcy4gIFdlIGRlZmluZSBfX2FyY2hfKltibF0gaGVyZSwgYW5kIGxlYXZlIF9fYXJjaF8qdworICogdG8gdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlLgorICovCisjZGVmaW5lIF9fYXJjaF9nZXRiKGEpCQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSkKKyNkZWZpbmUgX19hcmNoX2dldHcoYSkJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShhKSkKKyNkZWZpbmUgX19hcmNoX2dldGwoYSkJCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYSkpCisKKyNkZWZpbmUgX19hcmNoX3B1dGIodixhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShhKSA9ICh2KSkKKyNkZWZpbmUgX19hcmNoX3B1dHcodixhKQkJKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYSkgPSAodikpCisjZGVmaW5lIF9fYXJjaF9wdXRsKHYsYSkJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhKSA9ICh2KSkKKworZXh0ZXJuIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlc2IodW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBieXRlbGVuKQoreworCXVpbnQ4X3QgKmJ1ZiA9ICh1aW50OF90ICopZGF0YTsKKwl3aGlsZShieXRlbGVuLS0pCisJCV9fYXJjaF9wdXRiKCpidWYrKywgYWRkcik7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXN3KHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbikKK3sKKwl1aW50MTZfdCAqYnVmID0gKHVpbnQxNl90ICopZGF0YTsKKwl3aGlsZSh3b3JkbGVuLS0pCisJCV9fYXJjaF9wdXR3KCpidWYrKywgYWRkcik7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd193cml0ZXNsKHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbG9uZ2xlbikKK3sKKwl1aW50MzJfdCAqYnVmID0gKHVpbnQzMl90ICopZGF0YTsKKwl3aGlsZShsb25nbGVuLS0pCisJCV9fYXJjaF9wdXRsKCpidWYrKywgYWRkcik7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkc2IodW5zaWduZWQgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCBieXRlbGVuKQoreworCXVpbnQ4X3QgKmJ1ZiA9ICh1aW50OF90ICopZGF0YTsKKwl3aGlsZShieXRlbGVuLS0pCisJCSpidWYrKyA9IF9fYXJjaF9nZXRiKGFkZHIpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfcmVhZHN3KHVuc2lnbmVkIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbikKK3sKKwl1aW50MTZfdCAqYnVmID0gKHVpbnQxNl90ICopZGF0YTsKKwl3aGlsZSh3b3JkbGVuLS0pCisJCSpidWYrKyA9IF9fYXJjaF9nZXR3KGFkZHIpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgX19yYXdfcmVhZHNsKHVuc2lnbmVkIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgbG9uZ2xlbikKK3sKKwl1aW50MzJfdCAqYnVmID0gKHVpbnQzMl90ICopZGF0YTsKKwl3aGlsZShsb25nbGVuLS0pCisJCSpidWYrKyA9IF9fYXJjaF9nZXRsKGFkZHIpOworfQorCisjZGVmaW5lIF9fcmF3X3dyaXRlYih2LGEpCQlfX2FyY2hfcHV0Yih2LGEpCisjZGVmaW5lIF9fcmF3X3dyaXRldyh2LGEpCQlfX2FyY2hfcHV0dyh2LGEpCisjZGVmaW5lIF9fcmF3X3dyaXRlbCh2LGEpCQlfX2FyY2hfcHV0bCh2LGEpCisKKyNkZWZpbmUgX19yYXdfcmVhZGIoYSkJCQlfX2FyY2hfZ2V0YihhKQorI2RlZmluZSBfX3Jhd19yZWFkdyhhKQkJCV9fYXJjaF9nZXR3KGEpCisjZGVmaW5lIF9fcmF3X3JlYWRsKGEpCQkJX19hcmNoX2dldGwoYSkKKworI2RlZmluZSB3cml0ZWIodixhKQkJCV9fYXJjaF9wdXRiKHYsYSkKKyNkZWZpbmUgd3JpdGV3KHYsYSkJCQlfX2FyY2hfcHV0dyh2LGEpCisjZGVmaW5lIHdyaXRlbCh2LGEpCQkJX19hcmNoX3B1dGwodixhKQorCisjZGVmaW5lIHJlYWRiKGEpCQkJX19hcmNoX2dldGIoYSkKKyNkZWZpbmUgcmVhZHcoYSkJCQlfX2FyY2hfZ2V0dyhhKQorI2RlZmluZSByZWFkbChhKQkJCV9fYXJjaF9nZXRsKGEpCisKKy8qCisgKiBUaGUgY29tcGlsZXIgc2VlbXMgdG8gYmUgaW5jYXBhYmxlIG9mIG9wdGltaXNpbmcgY29uc3RhbnRzCisgKiBwcm9wZXJseS4gIFNwZWxsIGl0IG91dCB0byB0aGUgY29tcGlsZXIgaW4gc29tZSBjYXNlcy4KKyAqIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciBzbWFsbCB2YWx1ZXMgb2YgIm9mZiIgKDwgMTw8MTIpCisgKi8KKyNkZWZpbmUgX19yYXdfYmFzZV93cml0ZWIodmFsLGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9wdXRiKHZhbCxiYXNlLG9mZikKKyNkZWZpbmUgX19yYXdfYmFzZV93cml0ZXcodmFsLGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9wdXR3KHZhbCxiYXNlLG9mZikKKyNkZWZpbmUgX19yYXdfYmFzZV93cml0ZWwodmFsLGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9wdXRsKHZhbCxiYXNlLG9mZikKKworI2RlZmluZSBfX3Jhd19iYXNlX3JlYWRiKGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9nZXRiKGJhc2Usb2ZmKQorI2RlZmluZSBfX3Jhd19iYXNlX3JlYWR3KGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9nZXR3KGJhc2Usb2ZmKQorI2RlZmluZSBfX3Jhd19iYXNlX3JlYWRsKGJhc2Usb2ZmKQlfX2FyY2hfYmFzZV9nZXRsKGJhc2Usb2ZmKQorCisvKgorICogQ2xlYXIgYW5kIHNldCBiaXRzIGluIG9uZSBzaG90LiBUaGVzZSBtYWNyb3MgY2FuIGJlIHVzZWQgdG8gY2xlYXIgYW5kCisgKiBzZXQgbXVsdGlwbGUgYml0cyBpbiBhIHJlZ2lzdGVyIHVzaW5nIGEgc2luZ2xlIGNhbGwuIFRoZXNlIG1hY3JvcyBjYW4KKyAqIGFsc28gYmUgdXNlZCB0byBzZXQgYSBtdWx0aXBsZS1iaXQgYml0IHBhdHRlcm4gdXNpbmcgYSBtYXNrLCBieQorICogc3BlY2lmeWluZyB0aGUgbWFzayBpbiB0aGUgJ2NsZWFyJyBwYXJhbWV0ZXIgYW5kIHRoZSBuZXcgYml0IHBhdHRlcm4KKyAqIGluIHRoZSAnc2V0JyBwYXJhbWV0ZXIuCisgKi8KKworI2RlZmluZSBvdXRfYXJjaCh0eXBlLGVuZGlhbixhLHYpCV9fcmF3X3dyaXRlIyN0eXBlKGNwdV90b18jI2VuZGlhbih2KSxhKQorI2RlZmluZSBpbl9hcmNoKHR5cGUsZW5kaWFuLGEpCQllbmRpYW4jI190b19jcHUoX19yYXdfcmVhZCMjdHlwZShhKSkKKworI2RlZmluZSBvdXRfbGUzMihhLHYpCW91dF9hcmNoKGwsbGUzMixhLHYpCisjZGVmaW5lIG91dF9sZTE2KGEsdikJb3V0X2FyY2godyxsZTE2LGEsdikKKworI2RlZmluZSBpbl9sZTMyKGEpCWluX2FyY2gobCxsZTMyLGEpCisjZGVmaW5lIGluX2xlMTYoYSkJaW5fYXJjaCh3LGxlMTYsYSkKKworI2RlZmluZSBvdXRfYmUzMihhLHYpCW91dF9hcmNoKGwsYmUzMixhLHYpCisjZGVmaW5lIG91dF9iZTE2KGEsdikJb3V0X2FyY2godyxiZTE2LGEsdikKKworI2RlZmluZSBpbl9iZTMyKGEpCWluX2FyY2gobCxiZTMyLGEpCisjZGVmaW5lIGluX2JlMTYoYSkJaW5fYXJjaCh3LGJlMTYsYSkKKworI2RlZmluZSBvdXRfOChhLHYpCV9fcmF3X3dyaXRlYih2LGEpCisjZGVmaW5lIGluXzgoYSkJCV9fcmF3X3JlYWRiKGEpCisKKyNkZWZpbmUgY2xyYml0cyh0eXBlLCBhZGRyLCBjbGVhcikgXAorCW91dF8jI3R5cGUoKGFkZHIpLCBpbl8jI3R5cGUoYWRkcikgJiB+KGNsZWFyKSkKKworI2RlZmluZSBzZXRiaXRzKHR5cGUsIGFkZHIsIHNldCkgXAorCW91dF8jI3R5cGUoKGFkZHIpLCBpbl8jI3R5cGUoYWRkcikgfCAoc2V0KSkKKworI2RlZmluZSBjbHJzZXRiaXRzKHR5cGUsIGFkZHIsIGNsZWFyLCBzZXQpIFwKKwlvdXRfIyN0eXBlKChhZGRyKSwgKGluXyMjdHlwZShhZGRyKSAmIH4oY2xlYXIpKSB8IChzZXQpKQorCisjZGVmaW5lIGNscmJpdHNfYmUzMihhZGRyLCBjbGVhcikgY2xyYml0cyhiZTMyLCBhZGRyLCBjbGVhcikKKyNkZWZpbmUgc2V0Yml0c19iZTMyKGFkZHIsIHNldCkgc2V0Yml0cyhiZTMyLCBhZGRyLCBzZXQpCisjZGVmaW5lIGNscnNldGJpdHNfYmUzMihhZGRyLCBjbGVhciwgc2V0KSBjbHJzZXRiaXRzKGJlMzIsIGFkZHIsIGNsZWFyLCBzZXQpCisKKyNkZWZpbmUgY2xyYml0c19sZTMyKGFkZHIsIGNsZWFyKSBjbHJiaXRzKGxlMzIsIGFkZHIsIGNsZWFyKQorI2RlZmluZSBzZXRiaXRzX2xlMzIoYWRkciwgc2V0KSBzZXRiaXRzKGxlMzIsIGFkZHIsIHNldCkKKyNkZWZpbmUgY2xyc2V0Yml0c19sZTMyKGFkZHIsIGNsZWFyLCBzZXQpIGNscnNldGJpdHMobGUzMiwgYWRkciwgY2xlYXIsIHNldCkKKworI2RlZmluZSBjbHJiaXRzX2JlMTYoYWRkciwgY2xlYXIpIGNscmJpdHMoYmUxNiwgYWRkciwgY2xlYXIpCisjZGVmaW5lIHNldGJpdHNfYmUxNihhZGRyLCBzZXQpIHNldGJpdHMoYmUxNiwgYWRkciwgc2V0KQorI2RlZmluZSBjbHJzZXRiaXRzX2JlMTYoYWRkciwgY2xlYXIsIHNldCkgY2xyc2V0Yml0cyhiZTE2LCBhZGRyLCBjbGVhciwgc2V0KQorCisjZGVmaW5lIGNscmJpdHNfbGUxNihhZGRyLCBjbGVhcikgY2xyYml0cyhsZTE2LCBhZGRyLCBjbGVhcikKKyNkZWZpbmUgc2V0Yml0c19sZTE2KGFkZHIsIHNldCkgc2V0Yml0cyhsZTE2LCBhZGRyLCBzZXQpCisjZGVmaW5lIGNscnNldGJpdHNfbGUxNihhZGRyLCBjbGVhciwgc2V0KSBjbHJzZXRiaXRzKGxlMTYsIGFkZHIsIGNsZWFyLCBzZXQpCisKKyNkZWZpbmUgY2xyYml0c184KGFkZHIsIGNsZWFyKSBjbHJiaXRzKDgsIGFkZHIsIGNsZWFyKQorI2RlZmluZSBzZXRiaXRzXzgoYWRkciwgc2V0KSBzZXRiaXRzKDgsIGFkZHIsIHNldCkKKyNkZWZpbmUgY2xyc2V0Yml0c184KGFkZHIsIGNsZWFyLCBzZXQpIGNscnNldGJpdHMoOCwgYWRkciwgY2xlYXIsIHNldCkKKworLyoKKyAqIE5vdywgcGljayB1cCB0aGUgbWFjaGluZS1kZWZpbmVkIElPIGRlZmluaXRpb25zCisgKi8KKyNpZiAwCS8qIFhYWCMjI1hYWCAqLworI2luY2x1ZGUgPGFzbS9hcmNoL2lvLmg+CisjZW5kaWYJLyogWFhYIyMjWFhYICovCisKKy8qCisgKiAgSU8gcG9ydCBhY2Nlc3MgcHJpbWl0aXZlcworICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgQVJNIGRvZXNuJ3QgaGF2ZSBzcGVjaWFsIElPIGFjY2VzcyBpbnN0cnVjdGlvbnM7IGFsbCBJTyBpcyBtZW1vcnkKKyAqIG1hcHBlZC4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgZGVmaW5lZCB0byBwZXJmb3JtIGxpdHRsZSBlbmRpYW4gYWNjZXNzZXMKKyAqIG9ubHkuICBUaGVpciBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gYWNjZXNzIFBDSSBhbmQgSVNBIHBlcmlwaGVyYWxzLgorICoKKyAqIE5vdGUgdGhhdCBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmUsIHRoaXMgaW1wbGllcyB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqIGJpZyBlbmRpYW4gbW9kZSBjb25uZWN0aXZpdHkgaXMgaW4gcGxhY2UsIGFzIGRlc2NyaWJlZCBieSBudW1lcm91cworICogQVJNIGRvY3VtZW50czoKKyAqCisgKiAgICBQQ0k6ICBEMC1ENyAgIEQ4LUQxNSBEMTYtRDIzIEQyNC1EMzEKKyAqICAgIEFSTTogRDI0LUQzMSBEMTYtRDIzICBEOC1EMTUgIEQwLUQ3CisgKgorICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgaW8uaCBpbmNsdWRlIGRlZmluZXMgX19pbyB0byB0cmFuc2xhdGUgYW4gIklPIgorICogYWRkcmVzcyB0byBhIG1lbW9yeSBhZGRyZXNzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBwcmV2ZW50IEdDQyByZS1vcmRlcmluZyBvciBjYWNoaW5nIHZhbHVlcyBpbiBleHByZXNzaW9ucworICogYnkgaW50cm9kdWNpbmcgc2VxdWVuY2UgcG9pbnRzIGludG8gdGhlIGluKigpIGRlZmluaXRpb25zLiAgTm90ZSB0aGF0CisgKiBfX3Jhd18qIGRvIG5vdCBndWFyYW50ZWUgdGhpcyBiZWhhdmlvdXIuCisgKgorICogVGhlIHtpbixvdXR9W2J3bF0gbWFjcm9zIGFyZSBmb3IgZW11bGF0aW5nIHg4Ni1zdHlsZSBQQ0kvSVNBIElPIHNwYWNlLgorICovCisjaWZkZWYgX19pbworI2RlZmluZSBvdXRiKHYscCkJCQlfX3Jhd193cml0ZWIodixfX2lvKHApKQorI2RlZmluZSBvdXR3KHYscCkJCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksX19pbyhwKSkKKyNkZWZpbmUgb3V0bCh2LHApCQkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHYpLF9faW8ocCkpCisKKyNkZWZpbmUgaW5iKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBfX3Jhd19yZWFkYihfX2lvKHApKTsgX192OyB9KQorI2RlZmluZSBpbncocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KF9faW8ocCkpKTsgX192OyB9KQorI2RlZmluZSBpbmwocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMzJfdG9fY3B1KF9fcmF3X3JlYWRsKF9faW8ocCkpKTsgX192OyB9KQorCisjZGVmaW5lIG91dHNiKHAsZCxsKQkJCV9fcmF3X3dyaXRlc2IoX19pbyhwKSxkLGwpCisjZGVmaW5lIG91dHN3KHAsZCxsKQkJCV9fcmF3X3dyaXRlc3coX19pbyhwKSxkLGwpCisjZGVmaW5lIG91dHNsKHAsZCxsKQkJCV9fcmF3X3dyaXRlc2woX19pbyhwKSxkLGwpCisKKyNkZWZpbmUgaW5zYihwLGQsbCkJCQlfX3Jhd19yZWFkc2IoX19pbyhwKSxkLGwpCisjZGVmaW5lIGluc3cocCxkLGwpCQkJX19yYXdfcmVhZHN3KF9faW8ocCksZCxsKQorI2RlZmluZSBpbnNsKHAsZCxsKQkJCV9fcmF3X3JlYWRzbChfX2lvKHApLGQsbCkKKyNlbmRpZgorCisjZGVmaW5lIG91dGJfcCh2YWwscG9ydCkJCW91dGIoKHZhbCksKHBvcnQpKQorI2RlZmluZSBvdXR3X3AodmFsLHBvcnQpCQlvdXR3KCh2YWwpLChwb3J0KSkKKyNkZWZpbmUgb3V0bF9wKHZhbCxwb3J0KQkJb3V0bCgodmFsKSwocG9ydCkpCisjZGVmaW5lIGluYl9wKHBvcnQpCQkJaW5iKChwb3J0KSkKKyNkZWZpbmUgaW53X3AocG9ydCkJCQlpbncoKHBvcnQpKQorI2RlZmluZSBpbmxfcChwb3J0KQkJCWlubCgocG9ydCkpCisKKyNkZWZpbmUgb3V0c2JfcChwb3J0LGZyb20sbGVuKQkJb3V0c2IocG9ydCxmcm9tLGxlbikKKyNkZWZpbmUgb3V0c3dfcChwb3J0LGZyb20sbGVuKQkJb3V0c3cocG9ydCxmcm9tLGxlbikKKyNkZWZpbmUgb3V0c2xfcChwb3J0LGZyb20sbGVuKQkJb3V0c2wocG9ydCxmcm9tLGxlbikKKyNkZWZpbmUgaW5zYl9wKHBvcnQsdG8sbGVuKQkJaW5zYihwb3J0LHRvLGxlbikKKyNkZWZpbmUgaW5zd19wKHBvcnQsdG8sbGVuKQkJaW5zdyhwb3J0LHRvLGxlbikKKyNkZWZpbmUgaW5zbF9wKHBvcnQsdG8sbGVuKQkJaW5zbChwb3J0LHRvLGxlbikKKworLyoKKyAqIGlvcmVtYXAgYW5kIGZyaWVuZHMuCisgKgorICogaW9yZW1hcCB0YWtlcyBhIFBDSSBtZW1vcnkgYWRkcmVzcywgYXMgc3BlY2lmaWVkIGluCisgKiBsaW51eC9Eb2N1bWVudGF0aW9uL0lPLW1hcHBpbmcudHh0LiAgSWYgeW91IHdhbnQgYQorICogcGh5c2ljYWwgYWRkcmVzcywgdXNlIF9faW9yZW1hcCBpbnN0ZWFkLgorICovCitleHRlcm4gdm9pZCAqIF9faW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworZXh0ZXJuIHZvaWQgX19pb3VubWFwKHZvaWQgKmFkZHIpOworCisvKgorICogR2VuZXJpYyBpb3JlbWFwIHN1cHBvcnQuCisgKgorICogRGVmaW5lOgorICogIGlvbWVtX3ZhbGlkX2FkZHIob2ZmLHNpemUpCisgKiAgaW9tZW1fdG9fcGh5cyhvZmYpCisgKi8KKyNpZmRlZiBpb21lbV92YWxpZF9hZGRyCisjZGVmaW5lIF9fYXJjaF9pb3JlbWFwKG9mZixzeixub2NhY2hlKQkJCQkJXAorICh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX29mZiA9IChvZmYpLCBfc2l6ZSA9IChzeik7CQkJXAorCXZvaWQgKl9yZXQgPSAodm9pZCAqKTA7CQkJCQkJXAorCWlmIChpb21lbV92YWxpZF9hZGRyKF9vZmYsIF9zaXplKSkJCQkJXAorCQlfcmV0ID0gX19pb3JlbWFwKGlvbWVtX3RvX3BoeXMoX29mZiksX3NpemUsbm9jYWNoZSk7CVwKKwlfcmV0OwkJCQkJCQkJXAorIH0pCisKKyNkZWZpbmUgX19hcmNoX2lvdW5tYXAgX19pb3VubWFwCisjZW5kaWYKKworI2RlZmluZSBpb3JlbWFwKG9mZixzeikJCQlfX2FyY2hfaW9yZW1hcCgob2ZmKSwoc3opLDApCisjZGVmaW5lIGlvcmVtYXBfbm9jYWNoZShvZmYsc3opCQlfX2FyY2hfaW9yZW1hcCgob2ZmKSwoc3opLDEpCisjZGVmaW5lIGlvdW5tYXAoX2FkZHIpCQkJX19hcmNoX2lvdW5tYXAoX2FkZHIpCisKKy8qCisgKiBETUEtY29uc2lzdGVudCBtYXBwaW5nIGZ1bmN0aW9ucy4gIFRoZXNlIGFsbG9jYXRlL2ZyZWUgYSByZWdpb24gb2YKKyAqIHVuY2FjaGVkLCB1bndyaXRlLWJ1ZmZlcmVkIG1hcHBlZCBtZW1vcnkgc3BhY2UgZm9yIHVzZSB3aXRoIERNQQorICogZGV2aWNlcy4gIFRoaXMgaXMgdGhlICJnZW5lcmljIiB2ZXJzaW9uLiAgVGhlIFBDSSBzcGVjaWZpYyB2ZXJzaW9uCisgKiBpcyBpbiBwY2kuaAorICovCitleHRlcm4gdm9pZCAqY29uc2lzdGVudF9hbGxvYyhpbnQgZ2ZwLCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlKTsKK2V4dGVybiB2b2lkIGNvbnNpc3RlbnRfZnJlZSh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgaGFuZGxlKTsKK2V4dGVybiB2b2lkIGNvbnNpc3RlbnRfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsIGludCBydyk7CisKKy8qCisgKiBTdHJpbmcgdmVyc2lvbiBvZiBJTyBtZW1vcnkgYWNjZXNzIG9wczoKKyAqLworZXh0ZXJuIHZvaWQgX21lbWNweV9mcm9taW8odm9pZCAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgX21lbWNweV90b2lvKHVuc2lnbmVkIGxvbmcsIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIF9tZW1zZXRfaW8odW5zaWduZWQgbG9uZywgaW50LCBzaXplX3QpOworCitleHRlcm4gdm9pZCBfX3JlYWR3cml0ZV9idWcoY29uc3QgY2hhciAqZm4pOworCisvKgorICogSWYgdGhpcyBhcmNoaXRlY3R1cmUgaGFzIFBDSSBtZW1vcnkgSU8sIHRoZW4gZGVmaW5lIHRoZSByZWFkL3dyaXRlCisgKiBtYWNyb3MuICBUaGVzZSBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggdGhlIGNvb2tpZSBwYXNzZWQgZnJvbQorICogaW9yZW1hcC4KKyAqLworI2lmZGVmIF9fbWVtX3BjaQorCisjZGVmaW5lIHJlYWRiKGMpICh7IHVuc2lnbmVkIGludCBfX3YgPSBfX3Jhd19yZWFkYihfX21lbV9wY2koYykpOyBfX3Y7IH0pCisjZGVmaW5lIHJlYWR3KGMpICh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhfX21lbV9wY2koYykpKTsgX192OyB9KQorI2RlZmluZSByZWFkbChjKSAoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoX19yYXdfcmVhZGwoX19tZW1fcGNpKGMpKSk7IF9fdjsgfSkKKworI2RlZmluZSB3cml0ZWIodixjKQkJX19yYXdfd3JpdGViKHYsX19tZW1fcGNpKGMpKQorI2RlZmluZSB3cml0ZXcodixjKQkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHYpLF9fbWVtX3BjaShjKSkKKyNkZWZpbmUgd3JpdGVsKHYsYykJCV9fcmF3X3dyaXRlbChjcHVfdG9fbGUzMih2KSxfX21lbV9wY2koYykpCisKKyNkZWZpbmUgbWVtc2V0X2lvKGMsdixsKQkJX21lbXNldF9pbyhfX21lbV9wY2koYyksKHYpLChsKSkKKyNkZWZpbmUgbWVtY3B5X2Zyb21pbyhhLGMsbCkJCV9tZW1jcHlfZnJvbWlvKChhKSxfX21lbV9wY2koYyksKGwpKQorI2RlZmluZSBtZW1jcHlfdG9pbyhjLGEsbCkJCV9tZW1jcHlfdG9pbyhfX21lbV9wY2koYyksKGEpLChsKSkKKworI2RlZmluZSBldGhfaW9fY29weV9hbmRfc3VtKHMsYyxsLGIpIFwKKwkJCQlldGhfY29weV9hbmRfc3VtKChzKSxfX21lbV9wY2koYyksKGwpLChiKSkKKworc3RhdGljIGlubGluZSBpbnQKK2NoZWNrX3NpZ25hdHVyZSh1bnNpZ25lZCBsb25nIGlvX2FkZHIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ25hdHVyZSwKKwkJaW50IGxlbmd0aCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlkbyB7CisJCWlmIChyZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQorCQkJZ290byBvdXQ7CisJCWlvX2FkZHIrKzsKKwkJc2lnbmF0dXJlKys7CisJCWxlbmd0aC0tOworCX0gd2hpbGUgKGxlbmd0aCk7CisJcmV0dmFsID0gMTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZWxpZiAhZGVmaW5lZChyZWFkYikKKworI2RlZmluZSByZWFkYihhZGRyKQkJCShfX3JlYWR3cml0ZV9idWcoInJlYWRiIiksMCkKKyNkZWZpbmUgcmVhZHcoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJyZWFkdyIpLDApCisjZGVmaW5lIHJlYWRsKGFkZHIpCQkJKF9fcmVhZHdyaXRlX2J1ZygicmVhZGwiKSwwKQorI2RlZmluZSB3cml0ZWIodixhZGRyKQkJCV9fcmVhZHdyaXRlX2J1Zygid3JpdGViIikKKyNkZWZpbmUgd3JpdGV3KHYsYWRkcikJCQlfX3JlYWR3cml0ZV9idWcoIndyaXRldyIpCisjZGVmaW5lIHdyaXRlbCh2LGFkZHIpCQkJX19yZWFkd3JpdGVfYnVnKCJ3cml0ZWwiKQorCisjZGVmaW5lIGV0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkJX19yZWFkd3JpdGVfYnVnKCJldGhfaW9fY29weV9hbmRfc3VtIikKKworI2RlZmluZSBjaGVja19zaWduYXR1cmUoaW8sc2lnLGxlbikJKDApCisKKyNlbmRpZgkvKiBfX21lbV9wY2kgKi8KKworLyoKKyAqIElmIHRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBJU0EgSU8sIHRoZW4gZGVmaW5lIHRoZSBpc2FfcmVhZC9pc2Ffd3JpdGUKKyAqIG1hY3Jvcy4KKyAqLworI2lmZGVmIF9fbWVtX2lzYQorCisjZGVmaW5lIGlzYV9yZWFkYihhZGRyKQkJCV9fcmF3X3JlYWRiKF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX3JlYWR3KGFkZHIpCQkJX19yYXdfcmVhZHcoX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2FfcmVhZGwoYWRkcikJCQlfX3Jhd19yZWFkbChfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV93cml0ZWIodmFsLGFkZHIpCQlfX3Jhd193cml0ZWIodmFsLF9fbWVtX2lzYShhZGRyKSkKKyNkZWZpbmUgaXNhX3dyaXRldyh2YWwsYWRkcikJCV9fcmF3X3dyaXRldyh2YWwsX19tZW1faXNhKGFkZHIpKQorI2RlZmluZSBpc2Ffd3JpdGVsKHZhbCxhZGRyKQkJX19yYXdfd3JpdGVsKHZhbCxfX21lbV9pc2EoYWRkcikpCisjZGVmaW5lIGlzYV9tZW1zZXRfaW8oYSxiLGMpCQlfbWVtc2V0X2lvKF9fbWVtX2lzYShhKSwoYiksKGMpKQorI2RlZmluZSBpc2FfbWVtY3B5X2Zyb21pbyhhLGIsYykJX21lbWNweV9mcm9taW8oKGEpLF9fbWVtX2lzYShiKSwoYykpCisjZGVmaW5lIGlzYV9tZW1jcHlfdG9pbyhhLGIsYykJCV9tZW1jcHlfdG9pbyhfX21lbV9pc2EoKGEpKSwoYiksKGMpKQorCisjZGVmaW5lIGlzYV9ldGhfaW9fY29weV9hbmRfc3VtKGEsYixjLGQpIFwKKwkJCQlldGhfY29weV9hbmRfc3VtKChhKSxfX21lbV9pc2EoYiksKGMpLChkKSkKKworc3RhdGljIGlubGluZSBpbnQKK2lzYV9jaGVja19zaWduYXR1cmUodW5zaWduZWQgbG9uZyBpb19hZGRyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWduYXR1cmUsCisJCSAgICBpbnQgbGVuZ3RoKQoreworCWludCByZXR2YWwgPSAwOworCWRvIHsKKwkJaWYgKGlzYV9yZWFkYihpb19hZGRyKSAhPSAqc2lnbmF0dXJlKQorCQkJZ290byBvdXQ7CisJCWlvX2FkZHIrKzsKKwkJc2lnbmF0dXJlKys7CisJCWxlbmd0aC0tOworCX0gd2hpbGUgKGxlbmd0aCk7CisJcmV0dmFsID0gMTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZWxzZQkvKiBfX21lbV9pc2EgKi8KKworI2RlZmluZSBpc2FfcmVhZGIoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJpc2FfcmVhZGIiKSwwKQorI2RlZmluZSBpc2FfcmVhZHcoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJpc2FfcmVhZHciKSwwKQorI2RlZmluZSBpc2FfcmVhZGwoYWRkcikJCQkoX19yZWFkd3JpdGVfYnVnKCJpc2FfcmVhZGwiKSwwKQorI2RlZmluZSBpc2Ffd3JpdGViKHZhbCxhZGRyKQkJX19yZWFkd3JpdGVfYnVnKCJpc2Ffd3JpdGViIikKKyNkZWZpbmUgaXNhX3dyaXRldyh2YWwsYWRkcikJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX3dyaXRldyIpCisjZGVmaW5lIGlzYV93cml0ZWwodmFsLGFkZHIpCQlfX3JlYWR3cml0ZV9idWcoImlzYV93cml0ZWwiKQorI2RlZmluZSBpc2FfbWVtc2V0X2lvKGEsYixjKQkJX19yZWFkd3JpdGVfYnVnKCJpc2FfbWVtc2V0X2lvIikKKyNkZWZpbmUgaXNhX21lbWNweV9mcm9taW8oYSxiLGMpCV9fcmVhZHdyaXRlX2J1ZygiaXNhX21lbWNweV9mcm9taW8iKQorI2RlZmluZSBpc2FfbWVtY3B5X3RvaW8oYSxiLGMpCQlfX3JlYWR3cml0ZV9idWcoImlzYV9tZW1jcHlfdG9pbyIpCisKKyNkZWZpbmUgaXNhX2V0aF9pb19jb3B5X2FuZF9zdW0oYSxiLGMsZCkgXAorCQkJCV9fcmVhZHdyaXRlX2J1ZygiaXNhX2V0aF9pb19jb3B5X2FuZF9zdW0iKQorCisjZGVmaW5lIGlzYV9jaGVja19zaWduYXR1cmUoaW8sc2lnLGxlbikJKDApCisKKyNlbmRpZgkvKiBfX21lbV9pc2EgKi8KKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX19BU01fQVJNX0lPX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL21lbW9yeS5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiMmFmZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL21lbW9yeS5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9tZW1vcnkuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBOb3RlOiB0aGlzIGZpbGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBieSBub24tYXNtLy5oIGZpbGVzCisgKi8KKyNpZm5kZWYgX19BU01fQVJNX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSTV9NRU1PUllfSAorCisjaWYgMAkvKiBYWFgjIyNYWFggKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL21lbW9yeS5oPgorCisvKgorICogUEZOcyBhcmUgdXNlZCB0byBkZXNjcmliZSBhbnkgcGh5c2ljYWwgcGFnZTsgdGhpcyBtZWFucworICogUEZOIDAgPT0gcGh5c2ljYWwgYWRkcmVzcyAwLgorICoKKyAqIFRoaXMgaXMgdGhlIFBGTiBvZiB0aGUgZmlyc3QgUkFNIHBhZ2UgaW4gdGhlIGtlcm5lbAorICogZGlyZWN0LW1hcHBlZCB2aWV3LiAgV2UgYXNzdW1lIHRoaXMgaXMgdGhlIGZpcnN0IHBhZ2UKKyAqIG9mIFJBTSBpbiB0aGUgbWVtX21hcCBhcyB3ZWxsLgorICovCisjZGVmaW5lIFBIWVNfUEZOX09GRlNFVAkoUEhZU19PRkZTRVQgPj4gUEFHRV9TSElGVCkKKworLyoKKyAqIFRoZXNlIGFyZSAqb25seSogdmFsaWQgb24gdGhlIGtlcm5lbCBkaXJlY3QgbWFwcGVkIFJBTSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9pZCAqeCkKK3sKKwlyZXR1cm4gX192aXJ0X3RvX3BoeXMoKHVuc2lnbmVkIGxvbmcpKHgpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyB4KQoreworCXJldHVybiAodm9pZCAqKShfX3BoeXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykoeCkpKTsKK30KKworI2RlZmluZSBfX3BhKHgpCQkJX192aXJ0X3RvX3BoeXMoKHVuc2lnbmVkIGxvbmcpKHgpKQorI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopX19waHlzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpKHgpKSkKKworLyoKKyAqIFZpcnR1YWwgPC0+IERNQSB2aWV3IG1lbW9yeSBhZGRyZXNzIHRyYW5zbGF0aW9ucworICogQWdhaW4sIHRoZXNlIGFyZSAqb25seSogdmFsaWQgb24gdGhlIGtlcm5lbCBkaXJlY3QgbWFwcGVkIFJBTQorICogbWVtb3J5LiAgVXNlIG9mIHRoZXNlIGlzICpkZXByZWNpYXRlZCouCisgKi8KKyNkZWZpbmUgdmlydF90b19idXMoeCkJCShfX3ZpcnRfdG9fYnVzKCh1bnNpZ25lZCBsb25nKSh4KSkpCisjZGVmaW5lIGJ1c190b192aXJ0KHgpCQkoKHZvaWQgKikoX19idXNfdG9fdmlydCgodW5zaWduZWQgbG9uZykoeCkpKSkKKworLyoKKyAqIENvbnZlcnNpb24gYmV0d2VlbiBhIHN0cnVjdCBwYWdlIGFuZCBhIHBoeXNpY2FsIGFkZHJlc3MuCisgKgorICogTm90ZTogd2hlbiBjb252ZXJ0aW5nIGFuIHVua25vd24gcGh5c2ljYWwgYWRkcmVzcyB0byBhCisgKiBzdHJ1Y3QgcGFnZSwgdGhlIHJlc3VsdGluZyBwb2ludGVyIG11c3QgYmUgdmFsaWRhdGVkCisgKiB1c2luZyBWQUxJRF9QQUdFKCkuICBJdCBtdXN0IHJldHVybiBhbiBpbnZhbGlkIHN0cnVjdCBwYWdlCisgKiBmb3IgYW55IHBoeXNpY2FsIGFkZHJlc3Mgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBzeXN0ZW0KKyAqIFJBTSBhZGRyZXNzLgorICoKKyAqICBwYWdlX3RvX3BmbihwYWdlKQljb252ZXJ0IGEgc3RydWN0IHBhZ2UgKiB0byBhIFBGTiBudW1iZXIKKyAqICBwZm5fdG9fcGFnZShwZm4pCWNvbnZlcnQgYSBfdmFsaWRfIFBGTiBudW1iZXIgdG8gc3RydWN0IHBhZ2UgKgorICogIHBmbl92YWxpZChwZm4pCWluZGljYXRlcyB3aGV0aGVyIGEgUEZOIG51bWJlciBpcyB2YWxpZAorICoKKyAqICB2aXJ0X3RvX3BhZ2UoaykJY29udmVydCBhIF92YWxpZF8gdmlydHVhbCBhZGRyZXNzIHRvIHN0cnVjdCBwYWdlICoKKyAqICB2aXJ0X2FkZHJfdmFsaWQoaykJaW5kaWNhdGVzIHdoZXRoZXIgYSB2aXJ0dWFsIGFkZHJlc3MgaXMgdmFsaWQKKyAqLworI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisKKyNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJKCgocGFnZSkgLSBtZW1fbWFwKSArIFBIWVNfUEZOX09GRlNFVCkKKyNkZWZpbmUgcGZuX3RvX3BhZ2UocGZuKQkoKG1lbV9tYXAgKyAocGZuKSkgLSBQSFlTX1BGTl9PRkZTRVQpCisjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkoKHBmbikgPj0gUEhZU19QRk5fT0ZGU0VUICYmIChwZm4pIDwgKFBIWVNfUEZOX09GRlNFVCArIG1heF9tYXBucikpCisKKyNkZWZpbmUgdmlydF90b19wYWdlKGthZGRyKQkocGZuX3RvX3BhZ2UoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkpCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJKChrYWRkcikgPj0gUEFHRV9PRkZTRVQgJiYgKGthZGRyKSA8ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KQorCisjZGVmaW5lIFBIWVNfVE9fTklEKGFkZHIpCSgwKQorCisjZGVmaW5lIFZBTElEX1BBR0UocGFnZSkJKChwYWdlIC0gbWVtX21hcCkgPCBtYXhfbWFwbnIpCisKKyNlbHNlCisKKy8qCisgKiBUaGlzIGlzIG1vcmUgY29tcGxleC4gIFdlIGhhdmUgYSBzZXQgb2YgbWVtX21hcCBhcnJheXMgc3ByZWFkCisgKiBhcm91bmQgaW4gbWVtb3J5LgorICovCisjZGVmaW5lIHBhZ2VfdG9fcGZuKHBhZ2UpCQkJCQlcCisJKCgocGFnZSkgLSBwYWdlX3pvbmUocGFnZSktPnpvbmVfbWVtX21hcCkJCVwKKwkgICsgKHBhZ2Vfem9uZShwYWdlKS0+em9uZV9zdGFydF9wYWRkciA+PiBQQUdFX1NISUZUKSkKKworI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pCQkJCQlcCisJKFBGTl9UT19NQVBCQVNFKHBmbikgKyBMT0NBTF9NQVBfTlIoKHBmbikgPDwgUEFHRV9TSElGVCkpCisKKyNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCQkJCQlcCisgICh7CQkJCQkJCQlcCisJdW5zaWduZWQgaW50IG5vZGUgPSBQRk5fVE9fTklEKHBmbik7CQkJXAorCXN0cnVjdCBwZ2xpc3RfZGF0YSAqbmQgPSBOT0RFX0RBVEEobm9kZSk7CQlcCisJKChub2RlIDwgTlJfTk9ERVMpICYmCQkJCQlcCisJICgocGZuIC0gKG5kLT5ub2RlX3N0YXJ0X3BhZGRyID4+IFBBR0VfU0hJRlQpKSA8IG5kLT5ub2RlX3NpemUpKTtcCisgICB9KQorCisjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJCQkJCVwKKwkoQUREUl9UT19NQVBCQVNFKGthZGRyKSArIExPQ0FMX01BUF9OUihrYWRkcikpCisKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQkoS1ZBRERSX1RPX05JRChrYWRkcikgPCBOUl9OT0RFUykKKworLyoKKyAqIENvbW1vbiBkaXNjb250aWdtZW0gc3R1ZmYuCisgKiAgUEhZU19UT19OSUQgaXMgdXNlZCBieSB0aGUgQVJNIGtlcm5lbC9zZXR1cC5jCisgKi8KKyNkZWZpbmUgUEhZU19UT19OSUQoYWRkcikJUEZOX1RPX05JRCgoYWRkcikgPj4gUEFHRV9TSElGVCkKKworLyoKKyAqIDIuNCBjb21wYXRpYmlsaXR5CisgKgorICogVkFMSURfUEFHRSByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgZ2l2ZW4gcGFnZSBwb2ludGVyIGlzIHZhbGlkLgorICogVGhpcyBhc3N1bWVzIGFsbCBub2RlJ3MgbWVtX21hcHMgYXJlIHN0b3JlZCB3aXRoaW4gdGhlIG5vZGUgdGhleQorICogcmVmZXIgdG8uICBUaGlzIGlzIGFjdHVhbGx5IGluaGVyZW50bHkgYnVnZ3kuCisgKi8KKyNkZWZpbmUgVkFMSURfUEFHRShwYWdlKSBcCisoeyB1bnNpZ25lZCBpbnQgbm9kZSA9IEtWQUREUl9UT19OSUQocGFnZSk7IFwKKyAgICgobm9kZSA8IE5SX05PREVTKSAmJiBcCisgICAgICgodW5zaWduZWQpKChwYWdlKSAtIE5PREVfTUVNX01BUChub2RlKSkgPCBOT0RFX0RBVEEobm9kZSktPm5vZGVfc2l6ZSkpOyBcCit9KQorCisjZW5kaWYKKworLyoKKyAqIFdlIHNob3VsZCByZWFsbHkgZWxpbWluYXRlIHZpcnRfdG9fYnVzKCkgaGVyZSAtIGl0J3MgZGVwcmVjaWF0ZWQuCisgKi8KKyNkZWZpbmUgcGFnZV90b19idXMocGFnZSkJKHZpcnRfdG9fYnVzKHBhZ2VfYWRkcmVzcyhwYWdlKSkpCisKKyNlbmRpZgkvKiBYWFgjIyNYWFggKi8KKworI2VuZGlmCS8qIF9fQVNNX0FSTV9NRU1PUllfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxMjQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vcG9zaXhfdHlwZXMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBSdXNzZWxsIEtpbmcuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgQ2hhbmdlbG9nOgorICogICAyNy0wNi0xOTk2CVJNSwlDcmVhdGVkCisgKi8KKyNpZm5kZWYgX19BUkNIX0FSTV9QT1NJWF9UWVBFU19ICisjZGVmaW5lIF9fQVJDSF9BUk1fUE9TSVhfVFlQRVNfSAorCisvKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYWxseSB1c2VkIGJ5IHVzZXItbGV2ZWwgc29mdHdhcmUsIHNvIHlvdSBuZWVkIHRvCisgKiBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG5hbWVzcGFjZSBwb2xsdXRpb24gZXRjLiAgQWxzbywgd2UgY2Fubm90CisgKiBhc3N1bWUgR0NDIGlzIGJlaW5nIHVzZWQuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfZGV2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCV9fa2VybmVsX2lub190OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfbW9kZV90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfbmxpbmtfdDsKK3R5cGVkZWYgbG9uZwkJCV9fa2VybmVsX29mZl90OwordHlwZWRlZiBpbnQJCQlfX2tlcm5lbF9waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJX19rZXJuZWxfc2l6ZV90OwordHlwZWRlZiBpbnQJCQlfX2tlcm5lbF9zc2l6ZV90OwordHlwZWRlZiBpbnQJCQlfX2tlcm5lbF9wdHJkaWZmX3Q7Cit0eXBlZGVmIGxvbmcJCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCQlfX2tlcm5lbF9zdXNlY29uZHNfdDsKK3R5cGVkZWYgbG9uZwkJCV9fa2VybmVsX2Nsb2NrX3Q7Cit0eXBlZGVmIGludAkJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJCV9fa2VybmVsX2NhZGRyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQlfX2tlcm5lbF91aWQxNl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAkJX19rZXJuZWxfZ2lkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQlfX2tlcm5lbF91aWQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJCV9fa2VybmVsX2dpZDMyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCV9fa2VybmVsX29sZF9naWRfdDsKKworI2lmZGVmIF9fR05VQ19fCit0eXBlZGVmIGxvbmcgbG9uZwkJX19rZXJuZWxfbG9mZl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19VU0VfQUxMKQorCWludAl2YWxbMl07CisjZWxzZSAvKiAhZGVmaW5lZChfX0tFUk5FTF9fKSAmJiAhZGVmaW5lZChfX1VTRV9BTEwpICovCisJaW50CV9fdmFsWzJdOworI2VuZGlmIC8qICFkZWZpbmVkKF9fS0VSTkVMX18pICYmICFkZWZpbmVkKF9fVVNFX0FMTCkgKi8KK30gX19rZXJuZWxfZnNpZF90OworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAhZGVmaW5lZChfX0dMSUJDX18pIHx8IChfX0dMSUJDX18gPCAyKQorCisjdW5kZWYJX19GRF9TRVQKKyNkZWZpbmUgX19GRF9TRVQoZmQsIGZkc2V0cCkgXAorCQkoKChmZF9zZXQgKilmZHNldHApLT5mZHNfYml0c1tmZCA+PiA1XSB8PSAoMTw8KGZkICYgMzEpKSkKKworI3VuZGVmCV9fRkRfQ0xSCisjZGVmaW5lIF9fRkRfQ0xSKGZkLCBmZHNldHApIFwKKwkJKCgoZmRfc2V0ICopZmRzZXRwKS0+ZmRzX2JpdHNbZmQgPj4gNV0gJj0gfigxPDwoZmQgJiAzMSkpKQorCisjdW5kZWYJX19GRF9JU1NFVAorI2RlZmluZSBfX0ZEX0lTU0VUKGZkLCBmZHNldHApIFwKKwkJKCgoKGZkX3NldCAqKWZkc2V0cCktPmZkc19iaXRzW2ZkID4+IDVdICYgKDE8PChmZCAmIDMxKSkpICE9IDApCisKKyN1bmRlZglfX0ZEX1pFUk8KKyNkZWZpbmUgX19GRF9aRVJPKGZkc2V0cCkgXAorCQkobWVtc2V0IChmZHNldHAsIDAsIHNpemVvZiAoKihmZF9zZXQgKilmZHNldHApKSkKKworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vc2V0dXAuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZjRkYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20vc2V0dXAuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBTdHJ1Y3R1cmUgcGFzc2VkIHRvIGtlcm5lbCB0byB0ZWxsIGl0IGFib3V0IHRoZQorICogIGhhcmR3YXJlIGl0J3MgcnVubmluZyBvbi4gIFNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2FybS9TZXR1cAorICogIGZvciBtb3JlIGluZm8uCisgKgorICogTk9URToKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdHdvIHdheXMgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBib290CisgKiAgbG9hZGVyIHRvIHRoZSBrZXJuZWwuIFRoZSBvbGQgc3RydWN0IHBhcmFtX3N0cnVjdCBpcyBkZXByZWNhdGVkLAorICogIGJ1dCBpdCB3aWxsIGJlIGtlcHQgaW4gdGhlIGtlcm5lbCBmb3IgNSB5ZWFycyBmcm9tIG5vdworICogICgyMDAxKS4gVGhpcyB3aWxsIGFsbG93IGJvb3QgbG9hZGVycyB0byBjb252ZXJ0IHRvIHRoZSBuZXcgc3RydWN0CisgKiAgdGFnIHdheS4KKyAqLworI2lmbmRlZiBfX0FTTUFSTV9TRVRVUF9ICisjZGVmaW5lIF9fQVNNQVJNX1NFVFVQX0gKKworLyoKKyAqIFVzYWdlOgorICogIC0gZG8gbm90IGdvIGJsaW5kbHkgYWRkaW5nIGZpZWxkcywgYWRkIHRoZW0gYXQgdGhlIGVuZAorICogIC0gd2hlbiBhZGRpbmcgZmllbGRzLCBkb24ndCByZWx5IG9uIHRoZSBhZGRyZXNzIHVudGlsCisgKiAgICBhIHBhdGNoIGZyb20gbWUgaGFzIGJlZW4gcmVsZWFzZWQKKyAqICAtIHVudXNlZCBmaWVsZHMgc2hvdWxkIGJlIHplcm8gKGZvciBmdXR1cmUgZXhwYW5zaW9uKQorICogIC0gdGhpcyBzdHJ1Y3R1cmUgaXMgcmVsYXRpdmVseSBzaG9ydC1saXZlZCAtIG9ubHkKKyAqICAgIGd1YXJhbnRlZWQgdG8gY29udGFpbiB1c2VmdWwgZGF0YSBpbiBzZXR1cF9hcmNoKCkKKyAqLworI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAxMDI0CisKKy8qIFRoaXMgaXMgdGhlIG9sZCBkZXByZWNhdGVkIHdheSB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGtlcm5lbCAqLworc3RydWN0IHBhcmFtX3N0cnVjdCB7CisgICAgdW5pb24geworCXN0cnVjdCB7CisJICAgIHVuc2lnbmVkIGxvbmcgcGFnZV9zaXplOwkJLyogIDAgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBucl9wYWdlczsJCS8qICA0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgcmFtZGlza19zaXplOwkJLyogIDggKi8KKwkgICAgdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIDEyICovCisjZGVmaW5lIEZMQUdfUkVBRE9OTFkJMQorI2RlZmluZSBGTEFHX1JETE9BRAk0CisjZGVmaW5lIEZMQUdfUkRQUk9NUFQJOAorCSAgICB1bnNpZ25lZCBsb25nIHJvb3RkZXY7CQkvKiAxNiAqLworCSAgICB1bnNpZ25lZCBsb25nIHZpZGVvX251bV9jb2xzOwkvKiAyMCAqLworCSAgICB1bnNpZ25lZCBsb25nIHZpZGVvX251bV9yb3dzOwkvKiAyNCAqLworCSAgICB1bnNpZ25lZCBsb25nIHZpZGVvX3g7CQkvKiAyOCAqLworCSAgICB1bnNpZ25lZCBsb25nIHZpZGVvX3k7CQkvKiAzMiAqLworCSAgICB1bnNpZ25lZCBsb25nIG1lbWNfY29udHJvbF9yZWc7CS8qIDM2ICovCisJICAgIHVuc2lnbmVkIGNoYXIgc291bmRkZWZhdWx0OwkJLyogNDAgKi8KKwkgICAgdW5zaWduZWQgY2hhciBhZGZzZHJpdmVzOwkJLyogNDEgKi8KKwkgICAgdW5zaWduZWQgY2hhciBieXRlc19wZXJfY2hhcl9oOwkvKiA0MiAqLworCSAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX3Y7CS8qIDQzICovCisJICAgIHVuc2lnbmVkIGxvbmcgcGFnZXNfaW5fYmFua1s0XTsJLyogNDQgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBwYWdlc19pbl92cmFtOwkvKiA2MCAqLworCSAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9zdGFydDsJCS8qIDY0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3NpemU7CQkvKiA2OCAqLworCSAgICB1bnNpZ25lZCBsb25nIHJkX3N0YXJ0OwkJLyogNzIgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBzeXN0ZW1fcmV2OwkJLyogNzYgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBzeXN0ZW1fc2VyaWFsX2xvdzsJLyogODAgKi8KKwkgICAgdW5zaWduZWQgbG9uZyBzeXN0ZW1fc2VyaWFsX2hpZ2g7CS8qIDg0ICovCisJICAgIHVuc2lnbmVkIGxvbmcgbWVtX2ZjbGtfMjEyODU7ICAgICAgIC8qIDg4ICovCisJfSBzOworCWNoYXIgdW51c2VkWzI1Nl07CisgICAgfSB1MTsKKyAgICB1bmlvbiB7CisJY2hhciBwYXRoc1s4XVsxMjhdOworCXN0cnVjdCB7CisJICAgIHVuc2lnbmVkIGxvbmcgbWFnaWM7CisJICAgIGNoYXIgblsxMDI0IC0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwl9IHM7CisgICAgfSB1MjsKKyAgICBjaGFyIGNvbW1hbmRsaW5lW0NPTU1BTkRfTElORV9TSVpFXTsKK307CisKKworLyoKKyAqIFRoZSBuZXcgd2F5IG9mIHBhc3NpbmcgaW5mb3JtYXRpb246IGEgbGlzdCBvZiB0YWdnZWQgZW50cmllcworICovCisKKy8qIFRoZSBsaXN0IGVuZHMgd2l0aCBhbiBBVEFHX05PTkUgbm9kZS4gKi8KKyNkZWZpbmUgQVRBR19OT05FCTB4MDAwMDAwMDAKKworc3RydWN0IHRhZ19oZWFkZXIgeworCXUzMiBzaXplOworCXUzMiB0YWc7Cit9OworCisvKiBUaGUgbGlzdCBtdXN0IHN0YXJ0IHdpdGggYW4gQVRBR19DT1JFIG5vZGUgKi8KKyNkZWZpbmUgQVRBR19DT1JFCTB4NTQ0MTAwMDEKKworc3RydWN0IHRhZ19jb3JlIHsKKwl1MzIgZmxhZ3M7CQkvKiBiaXQgMCA9IHJlYWQtb25seSAqLworCXUzMiBwYWdlc2l6ZTsKKwl1MzIgcm9vdGRldjsKK307CisKKy8qIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBtdWx0aXBsZSBBVEFHX01FTSBub2RlcyAqLworI2RlZmluZSBBVEFHX01FTQkweDU0NDEwMDAyCisKK3N0cnVjdCB0YWdfbWVtMzIgeworCXUzMglzaXplOworCXUzMglzdGFydDsJLyogcGh5c2ljYWwgc3RhcnQgYWRkcmVzcyAqLworfTsKKworLyogVkdBIHRleHQgdHlwZSBkaXNwbGF5cyAqLworI2RlZmluZSBBVEFHX1ZJREVPVEVYVAkweDU0NDEwMDAzCisKK3N0cnVjdCB0YWdfdmlkZW90ZXh0IHsKKwl1OAkJeDsKKwl1OAkJeTsKKwl1MTYJCXZpZGVvX3BhZ2U7CisJdTgJCXZpZGVvX21vZGU7CisJdTgJCXZpZGVvX2NvbHM7CisJdTE2CQl2aWRlb19lZ2FfYng7CisJdTgJCXZpZGVvX2xpbmVzOworCXU4CQl2aWRlb19pc3ZnYTsKKwl1MTYJCXZpZGVvX3BvaW50czsKK307CisKKy8qIGRlc2NyaWJlcyBob3cgdGhlIHJhbWRpc2sgd2lsbCBiZSB1c2VkIGluIGtlcm5lbCAqLworI2RlZmluZSBBVEFHX1JBTURJU0sJMHg1NDQxMDAwNAorCitzdHJ1Y3QgdGFnX3JhbWRpc2sgeworCXUzMiBmbGFnczsJLyogYml0IDAgPSBsb2FkLCBiaXQgMSA9IHByb21wdCAqLworCXUzMiBzaXplOwkvKiBkZWNvbXByZXNzZWQgcmFtZGlzayBzaXplIGluIF9raWxvXyBieXRlcyAqLworCXUzMiBzdGFydDsJLyogc3RhcnRpbmcgYmxvY2sgb2YgZmxvcHB5LWJhc2VkIFJBTSBkaXNrIGltYWdlICovCit9OworCisvKiBkZXNjcmliZXMgd2hlcmUgdGhlIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSBsaXZlcyAodmlydHVhbCBhZGRyZXNzKSAqLworLyoKKyAqIHRoaXMgb25lIGFjY2lkZW50YWxseSB1c2VkIHZpcnR1YWwgYWRkcmVzc2VzIC0gYXMgc3VjaCwKKyAqIGl0cyBkZXByZWNpYXRlZC4KKyAqLworI2RlZmluZSBBVEFHX0lOSVRSRAkweDU0NDEwMDA1CisKKy8qIGRlc2NyaWJlcyB3aGVyZSB0aGUgY29tcHJlc3NlZCByYW1kaXNrIGltYWdlIGxpdmVzIChwaHlzaWNhbCBhZGRyZXNzKSAqLworI2RlZmluZSBBVEFHX0lOSVRSRDIJMHg1NDQyMDAwNQorCitzdHJ1Y3QgdGFnX2luaXRyZCB7CisJdTMyIHN0YXJ0OwkvKiBwaHlzaWNhbCBzdGFydCBhZGRyZXNzICovCisJdTMyIHNpemU7CS8qIHNpemUgb2YgY29tcHJlc3NlZCByYW1kaXNrIGltYWdlIGluIGJ5dGVzICovCit9OworCisvKiBib2FyZCBzZXJpYWwgbnVtYmVyLiAiNjQgYml0cyBzaG91bGQgYmUgZW5vdWdoIGZvciBldmVyeWJvZHkiICovCisjZGVmaW5lIEFUQUdfU0VSSUFMCTB4NTQ0MTAwMDYKKworc3RydWN0IHRhZ19zZXJpYWxuciB7CisJdTMyIGxvdzsKKwl1MzIgaGlnaDsKK307CisKKy8qIGJvYXJkIHJldmlzaW9uICovCisjZGVmaW5lIEFUQUdfUkVWSVNJT04JMHg1NDQxMDAwNworCitzdHJ1Y3QgdGFnX3JldmlzaW9uIHsKKwl1MzIgcmV2OworfTsKKworLyogaW5pdGlhbCB2YWx1ZXMgZm9yIHZlc2FmYi10eXBlIGZyYW1lYnVmZmVycy4gc2VlIHN0cnVjdCBzY3JlZW5faW5mbworICogaW4gaW5jbHVkZS9saW51eC90dHkuaAorICovCisjZGVmaW5lIEFUQUdfVklERU9MRkIJMHg1NDQxMDAwOAorCitzdHJ1Y3QgdGFnX3ZpZGVvbGZiIHsKKwl1MTYJCWxmYl93aWR0aDsKKwl1MTYJCWxmYl9oZWlnaHQ7CisJdTE2CQlsZmJfZGVwdGg7CisJdTE2CQlsZmJfbGluZWxlbmd0aDsKKwl1MzIJCWxmYl9iYXNlOworCXUzMgkJbGZiX3NpemU7CisJdTgJCXJlZF9zaXplOworCXU4CQlyZWRfcG9zOworCXU4CQlncmVlbl9zaXplOworCXU4CQlncmVlbl9wb3M7CisJdTgJCWJsdWVfc2l6ZTsKKwl1OAkJYmx1ZV9wb3M7CisJdTgJCXJzdmRfc2l6ZTsKKwl1OAkJcnN2ZF9wb3M7Cit9OworCisvKiBjb21tYW5kIGxpbmU6IFwwIHRlcm1pbmF0ZWQgc3RyaW5nICovCisjZGVmaW5lIEFUQUdfQ01ETElORQkweDU0NDEwMDA5CisKK3N0cnVjdCB0YWdfY21kbGluZSB7CisJY2hhcgljbWRsaW5lWzFdOwkvKiB0aGlzIGlzIHRoZSBtaW5pbXVtIHNpemUgKi8KK307CisKKy8qIGFjb3JuIFJpc2NQQyBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBBVEFHX0FDT1JOCTB4NDEwMDAxMDEKKworc3RydWN0IHRhZ19hY29ybiB7CisJdTMyIG1lbWNfY29udHJvbF9yZWc7CisJdTMyIHZyYW1fcGFnZXM7CisJdTggc291bmRkZWZhdWx0OworCXU4IGFkZnNkcml2ZXM7Cit9OworCisvKiBmb290YnJpZGdlIG1lbW9yeSBjbG9jaywgc2VlIGFyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9hcmNoLmMgKi8KKyNkZWZpbmUgQVRBR19NRU1DTEsJMHg0MTAwMDQwMgorCitzdHJ1Y3QgdGFnX21lbWNsayB7CisJdTMyIGZtZW1jbGs7Cit9OworCitzdHJ1Y3QgdGFnIHsKKwlzdHJ1Y3QgdGFnX2hlYWRlciBoZHI7CisJdW5pb24geworCQlzdHJ1Y3QgdGFnX2NvcmUJCWNvcmU7CisJCXN0cnVjdCB0YWdfbWVtMzIJbWVtOworCQlzdHJ1Y3QgdGFnX3ZpZGVvdGV4dAl2aWRlb3RleHQ7CisJCXN0cnVjdCB0YWdfcmFtZGlzawlyYW1kaXNrOworCQlzdHJ1Y3QgdGFnX2luaXRyZAlpbml0cmQ7CisJCXN0cnVjdCB0YWdfc2VyaWFsbnIJc2VyaWFsbnI7CisJCXN0cnVjdCB0YWdfcmV2aXNpb24JcmV2aXNpb247CisJCXN0cnVjdCB0YWdfdmlkZW9sZmIJdmlkZW9sZmI7CisJCXN0cnVjdCB0YWdfY21kbGluZQljbWRsaW5lOworCisJCS8qCisJCSAqIEFjb3JuIHNwZWNpZmljCisJCSAqLworCQlzdHJ1Y3QgdGFnX2Fjb3JuCWFjb3JuOworCisJCS8qCisJCSAqIERDMjEyODUgc3BlY2lmaWMKKwkJICovCisJCXN0cnVjdCB0YWdfbWVtY2xrCW1lbWNsazsKKwl9IHU7Cit9OworCitzdHJ1Y3QgdGFndGFibGUgeworCXUzMiB0YWc7CisJaW50ICgqcGFyc2UpKGNvbnN0IHN0cnVjdCB0YWcgKik7Cit9OworCisjZGVmaW5lIF9fdGFnIF9fYXR0cmlidXRlX18oKHVudXNlZCwgX19zZWN0aW9uX18oIi50YWdsaXN0IikpKQorI2RlZmluZSBfX3RhZ3RhYmxlKHRhZywgZm4pIFwKK3N0YXRpYyBzdHJ1Y3QgdGFndGFibGUgX190YWd0YWJsZV8jI2ZuIF9fdGFnID0geyB0YWcsIGZuIH0KKworI2RlZmluZSB0YWdfbWVtYmVyX3ByZXNlbnQodGFnLG1lbWJlcikJCQkJXAorCSgodW5zaWduZWQgbG9uZykoJigoc3RydWN0IHRhZyAqKTBMKS0+bWVtYmVyICsgMSkJXAorCQk8PSAodGFnKS0+aGRyLnNpemUgKiA0KQorCisjZGVmaW5lIHRhZ19uZXh0KHQpCSgoc3RydWN0IHRhZyAqKSgodTMyICopKHQpICsgKHQpLT5oZHIuc2l6ZSkpCisjZGVmaW5lIHRhZ19zaXplKHR5cGUpCSgoc2l6ZW9mKHN0cnVjdCB0YWdfaGVhZGVyKSArIHNpemVvZihzdHJ1Y3QgdHlwZSkpID4+IDIpCisKKyNkZWZpbmUgZm9yX2VhY2hfdGFnKHQsYmFzZSkJCVwKKwlmb3IgKHQgPSBiYXNlOyB0LT5oZHIuc2l6ZTsgdCA9IHRhZ19uZXh0KHQpKQorCisvKgorICogTWVtb3J5IG1hcCBkZXNjcmlwdGlvbgorICovCisjZGVmaW5lIE5SX0JBTktTIDgKKworc3RydWN0IG1lbWluZm8geworCWludCBucl9iYW5rczsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQl1bnNpZ25lZCBsb25nIHNpemU7CisJCWludCAgICAgICAgICAgbm9kZTsKKwl9IGJhbmtbTlJfQkFOS1NdOworfTsKKworZXh0ZXJuIHN0cnVjdCBtZW1pbmZvIG1lbWluZm87CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9hc20vc2l6ZXMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NpemVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkOTJjYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3NpemVzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworLyogRE8gTk9UIEVESVQhISAtIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorICogICAgICAgICAgICAgICAgIGZyb20gLnMgZmlsZSBieSBhd2sgLWYgczJoLmF3aworICovCisvKiAgU2l6ZSBkZWZpbnRpb25zCisgKiAgQ29weXJpZ2h0IChDKSBBUk0gTGltaXRlZCAxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisKKyNpZm5kZWYgX19zaXplc19oCisjZGVmaW5lIF9fc2l6ZXNfaCAgICAgICAgICAgICAgICAgICAgICAgMQorCisvKiBoYW5keSBzaXplcyAqLworI2RlZmluZSBTWl8xSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgU1pfNEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFNaXzhLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBTWl8xNksgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgU1pfNjRLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIFNaXzEyOEsgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBTWl8yNTZLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgU1pfNTEySyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisKKyNkZWZpbmUgU1pfMU0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNaXzJNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBTWl80TSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgU1pfOE0gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFNaXzE2TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBTWl8zMk0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgU1pfNjRNICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIFNaXzEyOE0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBTWl8yNTZNICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgU1pfNTEyTSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisKKyNkZWZpbmUgU1pfMUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIFNaXzJHICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisjZW5kaWYKKworLyogICAgICAgICBFTkQgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3N0cmluZy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlYTU4MgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3N0cmluZy5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX19BU01fQVJNX1NUUklOR19ICisjZGVmaW5lIF9fQVNNX0FSTV9TVFJJTkdfSAorCisvKgorICogV2UgZG9uJ3QgZG8gaW5saW5lIHN0cmluZyBmdW5jdGlvbnMsIHNpbmNlIHRoZQorICogb3B0aW1pc2VkIGlubGluZSBhc20gdmVyc2lvbnMgYXJlIG5vdCBzbWFsbC4KKyAqLworCisjdW5kZWYgX19IQVZFX0FSQ0hfU1RSUkNIUgorZXh0ZXJuIGNoYXIgKiBzdHJyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYyk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9TVFJDSFIKK2V4dGVybiBjaGFyICogc3RyY2hyKGNvbnN0IGNoYXIgKiBzLCBpbnQgYyk7CisKKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkKK2V4dGVybiB2b2lkICogbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX2tlcm5lbF9zaXplX3QpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNTU9WRQorZXh0ZXJuIHZvaWQgKiBtZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBfX2tlcm5lbF9zaXplX3QpOworCisjdW5kZWYgX19IQVZFX0FSQ0hfTUVNQ0hSCitleHRlcm4gdm9pZCAqIG1lbWNocihjb25zdCB2b2lkICosIGludCwgX19rZXJuZWxfc2l6ZV90KTsKKworI3VuZGVmIF9fSEFWRV9BUkNIX01FTVpFUk8KKyN1bmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQKK2V4dGVybiB2b2lkICogbWVtc2V0KHZvaWQgKiwgaW50LCBfX2tlcm5lbF9zaXplX3QpOworCisjaWYgMAorZXh0ZXJuIHZvaWQgX19tZW16ZXJvKHZvaWQgKnB0ciwgX19rZXJuZWxfc2l6ZV90IG4pOworCisjZGVmaW5lIG1lbXNldChwLHYsbikJCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCWlmICgobikgIT0gMCkgewkJCQkJCVwKKwkJCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCgodikpICYmICh2KSA9PSAwKQlcCisJCQkJX19tZW16ZXJvKChwKSwobikpOwkJCVwKKwkJCWVsc2UJCQkJCQlcCisJCQkJbWVtc2V0KChwKSwodiksKG4pKTsJCQlcCisJCX0JCQkJCQkJXAorCQkocCk7CQkJCQkJCVwKKwl9KQorCisjZGVmaW5lIG1lbXplcm8ocCxuKSAoeyBpZiAoKG4pICE9IDApIF9fbWVtemVybygocCksKG4pKTsgKHApOyB9KQorI2Vsc2UKK2V4dGVybiB2b2lkIG1lbXplcm8odm9pZCAqcHRyLCBfX2tlcm5lbF9zaXplX3Qgbik7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS90eXBlcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc5OTIzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9hc20vdHlwZXMuaApAQCAtMCwwICsxLDUzIEBACisjaWZuZGVmIF9fQVNNX0FSTV9UWVBFU19ICisjZGVmaW5lIF9fQVNNX0FSTV9UWVBFU19ICisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdW1vZGVfdDsKKworLyoKKyAqIF9feHggaXMgb2s6IGl0IGRvZXNuJ3QgcG9sbHV0ZSB0aGUgUE9TSVggbmFtZXNwYWNlLiBVc2UgdGhlc2UgaW4gdGhlCisgKiBoZWFkZXIgZmlsZXMgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZQorICovCisKK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIF9fczg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191ODsKKwordHlwZWRlZiBfX3NpZ25lZF9fIHNob3J0IF9fczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3UxNjsKKwordHlwZWRlZiBfX3NpZ25lZF9fIGludCBfX3MzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IF9fdTMyOworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZiBfX3NpZ25lZF9fIGxvbmcgbG9uZyBfX3M2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIF9fdTY0OworI2VuZGlmCisKKy8qCisgKiBUaGVzZSBhcmVuJ3QgZXhwb3J0ZWQgb3V0c2lkZSB0aGUga2VybmVsIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcworICovCisjaWZkZWYgX19LRVJORUxfXworCit0eXBlZGVmIHNpZ25lZCBjaGFyIHM4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OworCit0eXBlZGVmIHNpZ25lZCBzaG9ydCBzMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKKwordHlwZWRlZiBzaWduZWQgaW50IHMzMjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKKwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHM2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKKworI2RlZmluZSBCSVRTX1BFUl9MT05HIDMyCisKKy8qIERtYSBhZGRyZXNzZXMgYXJlIDMyLWJpdHMgd2lkZS4gICovCisKK3R5cGVkZWYgdTMyIGRtYV9hZGRyX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBwaHlzX3NpemVfdDsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2FzbS94LWxvYWQtYXJtLmggYi94LWxvYWRlci9pbmNsdWRlL2FzbS94LWxvYWQtYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmMjY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYXNtL3gtbG9hZC1hcm0uaApAQCAtMCwwICsxLDQwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMgorICogU3lzZ28gUmVhbC1UaW1lIFNvbHV0aW9ucywgR21iSCA8d3d3LmVsaW5vcy5jb20+CisgKiBNYXJpdXMgR3JvZWdlciA8bWdyb2VnZXJAc3lzZ28uZGU+CisgKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBTeXNnbyBSZWFsLVRpbWUgU29sdXRpb25zLCBHbWJIIDx3d3cuZWxpbm9zLmNvbT4KKyAqIEFsZXggWnVlcGtlIDxhenVAc3lzZ28uZGU+CisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfWF9MT0FEX0FSTV9IXworI2RlZmluZSBfWF9MT0FEX0FSTV9IXwkxCisKKy8qIGZvciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcywgc2VlIHN0YXJ0LlMgKi8KK2V4dGVybiB1bG9uZyBfYXJtYm9vdF9zdGFydDsJLyogY29kZSBzdGFydCAqLworZXh0ZXJuIHVsb25nIF9ic3Nfc3RhcnQ7CS8qIGNvZGUgKyBkYXRhIGVuZCA9PSBCU1Mgc3RhcnQgKi8KK2V4dGVybiB1bG9uZyBfYnNzX2VuZDsJCS8qIEJTUyBlbmQgKi8KKyAgIAorI2VuZGlmCS8qIF9YX0xPQURfQVJNX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2JjZC5oIGIveC1sb2FkZXIvaW5jbHVkZS9iY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjRhYTljCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9iY2QuaApAQCAtMCwwICsxLDI1IEBACisvKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIGNvcHksIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgY29kZQorICogaW4gdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIFZlcnNpb24gMiBvciBsYXRlciwKKyAqIGF0IHlvdXIgb3B0aW9uLgorICovCisKKy8qIGlubGluZSBmdW5jdGlvbnMgdG8gdHJhbnNsYXRlIHRvL2Zyb20gYmluYXJ5IGFuZCBiaW5hcnktY29kZWQgZGVjaW1hbAorICogKGZyZXF1ZW50bHkgZm91bmQgaW4gUlRDIGNoaXBzKS4KKyAqLworCisjaWZuZGVmIF9CQ0RfSAorI2RlZmluZSBfQkNEX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJjZDJiaW4odTggdmFsKQoreworCXJldHVybiAoKHZhbCkgJiAweDBmKSArICgodmFsKSA+PiA0KSAqIDEwOworfQorCitzdGF0aWMgaW5saW5lIHU4IGJpbjJiY2QgKHVuc2lnbmVkIGludCB2YWwpCit7CisJcmV0dXJuICgoKHZhbCAvIDEwKSA8PCA0KSB8ICh2YWwgJSAxMCkpOworfQorCisjZW5kaWYgLyogX0JDRF9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2Jvb3RtLmggYi94LWxvYWRlci9pbmNsdWRlL2Jvb3RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ZDI1OQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvYm9vdG0uaApAQCAtMCwwICsxLDU5IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEwIEdyYW50IEVyaWNrc29uIDxtYXJhdGhvbjk2QGdtYWlsLmNvbT4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYJX19CT09UTV9IX18KKyNkZWZpbmUJX19CT09UTV9IX18KKworI2luY2x1ZGUgImNvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxpbWFnZS5oPgorCisjZGVmaW5lIEJPT1RNX1NUQVRVU19GQUlMVVJFIDAKKyNkZWZpbmUgQk9PVE1fU1RBVFVTX1NVQ0NFU1MgMQorCisjZGVmaW5lIEJPT1RNX0lOREVYX1NUQVJUICAwCisjZGVmaW5lIEJPT1RNX0lOREVYX1NUT1AgIC0xCisKK3R5cGVkZWYgc3RydWN0IGJvb3RfZXh0ZW50IHsKKwl1bG9uZyBzdGFydDsKKwl1bG9uZyBzaXplOworfSBib290X2V4dGVudF90OworCit0eXBlZGVmIGludCAoKmRldmljZV9sb2FkKSh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgpOworCitzdGF0aWMgaW5saW5lIGludCBib290bV9sb2FkX3N1Y2Nlc3NmdWwoaW50IHN0YXR1cykKK3sKKwlyZXR1cm4gKHN0YXR1cyA9PSBCT09UTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJvb3RtX2xvYWRfY29udGludWUoaW50IHN0YXR1cywgaW50IGluZGV4KQoreworCXJldHVybiAoKHN0YXR1cyAhPSBCT09UTV9TVEFUVVNfU1VDQ0VTUykgJiYgKGluZGV4ICE9IEJPT1RNX0lOREVYX1NUT1ApKTsKK30KKworZXh0ZXJuIGludCBib290bShjb25zdCB1aW50OF90ICpidWZmZXIpOworZXh0ZXJuIGludCBib290bV9iaW5hcnkoY29uc3QgdWludDhfdCAqYnVmZmVyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKK2V4dGVybiBpbnQgYm9vdG1faW1hZ2UoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmltYWdlKTsKKyNlbmRpZgorCisjZW5kaWYJLyogX19CT09UTV9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29tbWFuZC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5MzZhZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29tbWFuZC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKiAgRGVmaW5pdGlvbnMgZm9yIENvbW1hbmQgUHJvY2Vzc29yCisgKi8KKyNpZm5kZWYgX19DT01NQU5EX0gKKyNkZWZpbmUgX19DT01NQU5EX0gKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwJMAorI2VuZGlmCisKKyNpZm5kZWYJX19BU1NFTUJMWV9fCisvKgorICogTW9uaXRvciBDb21tYW5kIFRhYmxlCisgKi8KKworc3RydWN0IGNtZF90YmxfcyB7CisJY2hhcgkJKm5hbWU7CQkvKiBDb21tYW5kIE5hbWUJCQkqLworCWludAkJbWF4YXJnczsJLyogbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzCSovCisJaW50CQlyZXBlYXRhYmxlOwkvKiBhdXRvcmVwZWF0IGFsbG93ZWQ/CQkqLworCQkJCQkvKiBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbgkqLworCWludAkJKCpjbWQpKHN0cnVjdCBjbWRfdGJsX3MgKiwgaW50LCBpbnQsIGNoYXIgKltdKTsKKwljaGFyCQkqdXNhZ2U7CQkvKiBVc2FnZSBtZXNzYWdlCShzaG9ydCkJKi8KKyNpZmRlZglDRkdfTE9OR0hFTFAKKwljaGFyCQkqaGVscDsJCS8qIEhlbHAgIG1lc3NhZ2UJKGxvbmcpCSovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVUT19DT01QTEVURQorCS8qIGRvIGF1dG8gY29tcGxldGlvbiBvbiB0aGUgYXJndW1lbnRzICovCisJaW50CQkoKmNvbXBsZXRlKShpbnQgYXJnYywgY2hhciAqYXJndltdLCBjaGFyIGxhc3RfY2hhciwgaW50IG1heHYsIGNoYXIgKmNtZHZbXSk7CisjZW5kaWYKK307CisKK3R5cGVkZWYgc3RydWN0IGNtZF90YmxfcwljbWRfdGJsX3Q7CisKK2V4dGVybiBjbWRfdGJsX3QgIF9fdV9ib290X2NtZF9zdGFydDsKK2V4dGVybiBjbWRfdGJsX3QgIF9fdV9ib290X2NtZF9lbmQ7CisKKworLyogY29tbW9uL2NvbW1hbmQuYyAqLworY21kX3RibF90ICpmaW5kX2NtZChjb25zdCBjaGFyICpjbWQpOworCisjaWZkZWYgQ09ORklHX0FVVE9fQ09NUExFVEUKK2V4dGVybiB2b2lkIGluc3RhbGxfYXV0b19jb21wbGV0ZSh2b2lkKTsKK2V4dGVybiBpbnQgY21kX2F1dG9fY29tcGxldGUoY29uc3QgY2hhciAqY29uc3QgcHJvbXB0LCBjaGFyICpidWYsIGludCAqbnAsIGludCAqY29scCk7CisjZW5kaWYKKworLyoKKyAqIE1vbml0b3IgQ29tbWFuZAorICoKKyAqIEFsbCBjb21tYW5kcyB1c2UgYSBjb21tb24gYXJndW1lbnQgZm9ybWF0OgorICoKKyAqIHZvaWQgZnVuY3Rpb24gKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKTsKKyAqLworCit0eXBlZGVmCXZvaWQgCWNvbW1hbmRfdCAoY21kX3RibF90ICosIGludCwgaW50LCBjaGFyICpbXSk7CisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKworLyoKKyAqIENvbW1hbmQgRmxhZ3M6CisgKi8KKyNkZWZpbmUgQ01EX0ZMQUdfUkVQRUFUCQkweDAwMDEJLyogcmVwZWF0IGxhc3QgY29tbWFuZAkJKi8KKyNkZWZpbmUgQ01EX0ZMQUdfQk9PVEQJCTB4MDAwMgkvKiBjb21tYW5kIGlzIGZyb20gYm9vdGQJKi8KKworLyoKKyAqIENvbmZpZ3VyYWJsZSBtb25pdG9yIGNvbW1hbmRzIGRlZmluaXRpb25zIGhhdmUgYmVlbiBtb3ZlZAorICogdG8gaW5jbHVkZS9jbWRfY29uZmRlZnMuaAorICovCisKKworI2RlZmluZSBTdHJ1Y3RfU2VjdGlvbiAgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxzZWN0aW9uICgiLnVfYm9vdF9jbWQiKSkpCisKKyNpZmRlZiAgQ0ZHX0xPTkdIRUxQCisKKyNkZWZpbmUgVV9CT09UX0NNRChuYW1lLG1heGFyZ3MscmVwLGNtZCx1c2FnZSxoZWxwKSBcCitjbWRfdGJsX3QgX191X2Jvb3RfY21kXyMjbmFtZSBTdHJ1Y3RfU2VjdGlvbiA9IHsjbmFtZSwgbWF4YXJncywgcmVwLCBjbWQsIHVzYWdlLCBoZWxwfQorCisjZWxzZQkvKiBubyBsb25nIGhlbHAgaW5mbyAqLworCisjZGVmaW5lIFVfQk9PVF9DTUQobmFtZSxtYXhhcmdzLHJlcCxjbWQsdXNhZ2UsaGVscCkgXAorY21kX3RibF90IF9fdV9ib290X2NtZF8jI25hbWUgU3RydWN0X1NlY3Rpb24gPSB7I25hbWUsIG1heGFyZ3MsIHJlcCwgY21kLCB1c2FnZX0KKworI2VuZGlmCS8qIENGR19MT05HSEVMUCAqLworCisjZW5kaWYJLyogX19DT01NQU5EX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29tbW9uLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMThhYzgKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbW1vbi5oCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA5CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT01NT05fSF8KKyNkZWZpbmUgX19DT01NT05fSF8JMQorCisjdW5kZWYJX0xJTlVYX0NPTkZJR19ICisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSCAxCS8qIGF2b2lkIHJlYWRpbmcgTGludXggYXV0b2NvbmYuaCBmaWxlCSovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCQkvKiBwdXQgQyBvbmx5IHN0dWZmIGluIHRoaXMgc2VjdGlvbiAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVjaGFyOwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nCXZ1X2xvbmc7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHZ1X3Nob3J0OwordHlwZWRlZiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyCXZ1X2NoYXI7CisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgQ09ORklHX0FSTQorI2RlZmluZSBhc21saW5rYWdlCS8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSTQorIyBpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyMgaW5jbHVkZSA8YXNtL3gtbG9hZC1hcm0uaD4JLyogQVJNIHZlcnNpb24gdG8gYmUgZml4ZWQhICovCisjZW5kaWYgLyogQ09ORklHX0FSTSAqLworCisjaWZkZWYJQ0ZHX1BSSU5URgorI2RlZmluZSBwcmludGYoZm10LGFyZ3MuLi4pCXNlcmlhbF9wcmludGYgKGZtdCAsIyNhcmdzKQorI2RlZmluZSBnZXRjKCkgc2VyaWFsX2dldGMoKQorI2Vsc2UKKyNkZWZpbmUgcHJpbnRmKGZtdCxhcmdzLi4uKQorI2RlZmluZSBnZXRjKCkgJyAnCisjZW5kaWYJLyogQ0ZHX1BSSU5URiAqLworCisjZGVmaW5lIERVTVBfUkVHKHRhZywgcmVnLCB0eXBlLCBvcCwgZm9ybWF0KSBkbyB7CQkJXAorICAgICAgICByZWdpc3RlciB1MzIgX3JlZ3ZhciA9IHJlZzsJCQkJCQkJXAorCQlyZWdpc3RlciB0eXBlIF9kYXRhdmFyID0gb3AoX3JlZ3Zhcik7CQkJCVwKKyAgICAgICAgcHJpbnRmKCIgICAgJS0zMHMgQCAweCUwOHggPSAiICNmb3JtYXQgIlxuIiwJCVwKKwkJCSAgIHRhZywgX3JlZ3ZhciwgX2RhdGF2YXIpOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFVNUF9SRUdCKG1uZW1vbmljKQkJCQkJCQkJCVwKKwlEVU1QX1JFRygjbW5lbW9uaWMsIG1uZW1vbmljLCB1OCwgX19yYXdfcmVhZGIsIDB4JTAyeCkKKworI2RlZmluZSBEVU1QX1JFR1cobW5lbW9uaWMpCQkJCQkJCQkJXAorCURVTVBfUkVHKCNtbmVtb25pYywgbW5lbW9uaWMsIHUxNiwgX19yYXdfcmVhZHcsIDB4JTA0eCkKKworI2RlZmluZSBEVU1QX1JFR0wobW5lbW9uaWMpCQkJCQkJCQkJXAorCURVTVBfUkVHKCNtbmVtb25pYywgbW5lbW9uaWMsIHUzMiwgX19yYXdfcmVhZGwsIDB4JTA4eCkKKworI2lmZGVmCURFQlVHCisjZGVmaW5lIGRlYnVnKGZtdCxhcmdzLi4uKQlwcmludGYgKGZtdCAsIyNhcmdzKQorI2RlZmluZSBkZWJ1Z1gobGV2ZWwsZm10LGFyZ3MuLi4pIGlmIChERUJVRz49bGV2ZWwpIHByaW50ZihmbXQsIyNhcmdzKTsKKyNlbHNlCisjZGVmaW5lIGRlYnVnKGZtdCxhcmdzLi4uKQorI2RlZmluZSBkZWJ1Z1gobGV2ZWwsZm10LGFyZ3MuLi4pCisjZW5kaWYJLyogREVCVUcgKi8KKworI2RlZmluZSBlcnJvcihmbXQsIGFyZ3MuLi4pIGRvIHsJCQkJCVwKKwkJcHJpbnRmKCJFUlJPUjogIiBmbXQgIlxuYXQgJXM6JWQvJXMoKVxuIiwJCVwKKwkJCSMjYXJncywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CQlcCit9IHdoaWxlICgwKQorCisjaWZuZGVmIEJVRworI2RlZmluZSBCVUcoKSBkbyB7IFwKKwlwcmludGYoIkJVRzogZmFpbHVyZSBhdCAlczolZC8lcygpIVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBcCisJcGFuaWMoIkJVRyEiKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoKGNvbmRpdGlvbikhPTApKSBCVUcoKTsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIEJVRyAqLworCisvKgorICogR2VuZXJhbCBQdXJwb3NlIFV0aWxpdGllcworICovCisjZGVmaW5lIG1pbihYLCBZKQkJCQlcCisJKHsgdHlwZW9mIChYKSBfX3ggPSAoWCksIF9feSA9IChZKTsJXAorCQkoX194IDwgX195KSA/IF9feCA6IF9feTsgfSkKKworI2RlZmluZSBtYXgoWCwgWSkJCQkJXAorCSh7IHR5cGVvZiAoWCkgX194ID0gKFgpLCBfX3kgPSAoWSk7CVwKKwkJKF9feCA+IF9feSkgPyBfX3ggOiBfX3k7IH0pCisKKyNkZWZpbmUgTUlOKHgsIHkpICBtaW4oeCwgeSkKKyNkZWZpbmUgTUFYKHgsIHkpICBtYXgoeCwgeSkKKworCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKKwljb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKwkodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorCisvKiAqLworaW50CWRpc3BsYXlfb3B0aW9ucyAodm9pZCk7Cit2b2lkCXByaW50X3NpemUodW5zaWduZWQgbG9uZyBsb25nLCBjb25zdCBjaGFyICopOworaW50CXByaW50X2J1ZmZlciAodWxvbmcgYWRkciwgdm9pZCogZGF0YSwgdWludCB3aWR0aCwgdWludCBjb3VudCwgdWludCBsaW5lbGVuKTsKKworLyogYm9hcmQvJChCT0FSRCkvJChCT0FSRCkuYyAqLworaW50IAlib2FyZF9pbml0ICh2b2lkKTsKK2ludCAJbmFuZF9pbml0ICh2b2lkKTsKK2ludCAgICAgbW1jX2Jvb3QgKHVuc2lnbmVkIGNoYXIgKmJ1Zik7Cit2b2lkCWJvYXJkX2hhbmcgKHZvaWQpOwordm9pZCAgICBkb191c2Iodm9pZCk7CisKKworLyogY3B1LyQoQ1BVKS9jcHUuYyAqLworaW50IAljcHVfaW5pdCAodm9pZCk7CisjaWZkZWYgIENGR19VREVMQVkKK3ZvaWQgCXVkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKTsKKyNlbmRpZgorCisvKiBuYW5kIGRyaXZlciAqLworI2RlZmluZSBOQU5EX0NNRF9SRUFEMAkJMAorI2RlZmluZSBOQU5EX0NNRF9SRUFEMQkJMQorI2RlZmluZSBOQU5EX0NNRF9SRUFET09CCTB4NTAKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTCQkweDcwCisjZGVmaW5lIE5BTkRfQ01EX1JFQURJRAkJMHg5MAorI2RlZmluZSBOQU5EX0NNRF9SRVNFVAkJMHhmZgorCisvKiBFeHRlbmRlZCBDb21tYW5kcyBmb3IgTGFyZ2UgcGFnZSBkZXZpY2VzICovCisjZGVmaW5lIE5BTkRfQ01EX1JFQURTVEFSVAkweDMwCisKKy8qIFJldHVybiBjb2RlcyBmb3IgbmFuZCByZWFkcyAqLworI2RlZmluZSBOQU5EX1JFQURfU1VDQ0VTUyAgICAgICAgICAgICAgMAorI2RlZmluZSBOQU5EX1JFQURfU0tJUFBFRF9CQURfQkxPQ0sgICAgMQorI2RlZmluZSBOQU5EX1JFQURfRUNDX0ZBSUxVUkUgICAgICAgICAgMgorCitpbnQgCW5hbmRfY2hpcCh2b2lkKTsKK2ludCAJbmFuZF9yZWFkX2Jsb2NrKHVjaGFyICpidWYsIHVsb25nIGJsb2NrX2FkZHIpOworCitpbnQgCW9uZW5hbmRfY2hpcCh2b2lkKTsKK2ludAlvbmVuYW5kX3JlYWRfYmxvY2sodW5zaWduZWQgY2hhciAqYnVmLCB1bG9uZyBibG9jayk7CisKKworI2lmZGVmIENGR19QUklOVEYKKworLyogc2VyaWFsIGRyaXZlciAqLworaW50CXNlcmlhbF9pbml0ICAgKHZvaWQpOwordm9pZAlzZXJpYWxfc2V0YnJnICh2b2lkKTsKK3ZvaWQJc2VyaWFsX3B1dGMgICAoY29uc3QgY2hhcik7Cit2b2lkCXNlcmlhbF9wdXRzICAgKGNvbnN0IGNoYXIgKik7CitpbnQJc2VyaWFsX2dldGMgICAodm9pZCk7CitpbnQJc2VyaWFsX3RzdGMgICAodm9pZCk7CisKKy8qIGxpYi9wcmludGYuYyAqLwordm9pZAlzZXJpYWxfcHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLik7CisjZW5kaWYKKworLyogbGliL2NyYy5jICovCit2b2lkIAluYW5kX2NhbGN1bGF0ZV9lY2MgKGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKTsKKworLyogbGliL3ZzcHJpbnRmLmMgKi8KKworaW50IAluYW5kX2NvcnJlY3RfZGF0YSAodV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpOworCisvKiBsaWIvYm9hcmQuYyAqLwordm9pZAloYW5nCQkodm9pZCkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7CisKKy8qIHN0ZG91dCAqLwordm9pZAlwdXRzKGNvbnN0IGNoYXIgKnMpOworCisvKgorICogQm9hcmQtc3BlY2lmaWMgUGxhdGZvcm0gY29kZSBjYW4gcmVpbXBsZW1lbnQgc2hvd19ib290X3Byb2dyZXNzICgpIGlmIG5lZWRlZAorICovCit2b2lkIHNob3dfYm9vdF9wcm9ncmVzcyhpbnQgdmFsKTsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisvKiBQdXQgb25seSBzdHVmZiBoZXJlIHRoYXQgdGhlIGFzc2VtYmxlciBjYW4gZGlnZXN0ICovCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNkZWZpbmUgUk9VTkQoYSxiKQkJKCgoYSkgKyAoYikpICYgfigoYikgLSAxKSkKKyNkZWZpbmUgRElWX1JPVU5EKG4sZCkJCSgoKG4pICsgKChkKS8yKSkgLyAoZCkpCisjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpCSgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCisjZGVmaW5lIHJvdW5kdXAoeCwgeSkJCSgoKCh4KSArICgoeSkgLSAxKSkgLyAoeSkpICogKHkpKQorCisjZGVmaW5lIEFMSUdOKHgsYSkJCV9fQUxJR05fTUFTSygoeCksKHR5cGVvZih4KSkoYSktMSkKKyNkZWZpbmUgX19BTElHTl9NQVNLKHgsbWFzaykJKCgoeCkrKG1hc2spKSZ+KG1hc2spKQorCisjZW5kaWYJLyogX19DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29tcGlsZXIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Y0YjgzCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb21waWxlci5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogS2VlcCBhbGwgdGhlIHVnbHkgI2lmZGVmIGZvciBzeXN0ZW0gc3R1ZmYgaGVyZQorICovCisKKyNpZm5kZWYgX19DT01QSUxFUl9IX18KKyNkZWZpbmUgX19DT01QSUxFUl9IX18KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgVVNFX0hPU1RDQworCisjaWYgZGVmaW5lZChfX0JFT1NfXykJIHx8IFwKKyAgICBkZWZpbmVkKF9fTmV0QlNEX18pICB8fCBcCisgICAgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgXAorICAgIGRlZmluZWQoX19zdW5fXykJIHx8IFwKKyAgICBkZWZpbmVkKF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmICFkZWZpbmVkKF9fV0lOMzJfXykgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjIGluY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworLyogTm90IGFsbCBzeXN0ZW1zIChsaWtlIFdpbmRvd3MpIGhhcyB0aGlzIGRlZmluZSwgYW5kIHllcworICogd2UgZG8gcmVwbGFjZS9lbXVsYXRlIG1tYXAoKSBvbiB0aG9zZSBzeXN0ZW1zIC4uLgorICovCisjaWZuZGVmIE1BUF9GQUlMRUQKKyMgZGVmaW5lIE1BUF9GQUlMRUQgKCh2b2lkICopLTEpCisjZW5kaWYKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZuZGVmIE9fQklOQVJZCQkvKiBzaG91bGQgYmUgZGVmaW5lJ2Qgb24gX19XSU4zMl9fICovCisjZGVmaW5lIE9fQklOQVJZCTAKKyNlbmRpZgorCisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPGVuZGlhbi5oPgorIyBpbmNsdWRlIDxieXRlc3dhcC5oPgorI2VsaWYgZGVmaW5lZChfX01BQ0hfXykKKyMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICB1aW50OworI2VuZGlmCisKK3R5cGVkZWYgdWludDhfdCBfX3U4OwordHlwZWRlZiB1aW50MTZfdCBfX3UxNjsKK3R5cGVkZWYgdWludDMyX3QgX191MzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1aW50OworCisjZGVmaW5lIHVzd2FwXzE2KHgpIFwKKwkoKCgoeCkgJiAweGZmMDApID4+IDgpIHwgXAorCSAoKCh4KSAmIDB4MDBmZikgPDwgOCkpCisjZGVmaW5lIHVzd2FwXzMyKHgpIFwKKwkoKCgoeCkgJiAweGZmMDAwMDAwKSA+PiAyNCkgfCBcCisJICgoKHgpICYgMHgwMGZmMDAwMCkgPj4gIDgpIHwgXAorCSAoKCh4KSAmIDB4MDAwMGZmMDApIDw8ICA4KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkpCisjZGVmaW5lIF91c3dhcF82NCh4LCBzZngpIFwKKwkoKCgoeCkgJiAweGZmMDAwMDAwMDAwMDAwMDAjI3NmeCkgPj4gNTYpIHwgXAorCSAoKCh4KSAmIDB4MDBmZjAwMDAwMDAwMDAwMCMjc2Z4KSA+PiA0MCkgfCBcCisJICgoKHgpICYgMHgwMDAwZmYwMDAwMDAwMDAwIyNzZngpID4+IDI0KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMGZmMDAwMDAwMDAjI3NmeCkgPj4gIDgpIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwMDBmZjAwMDAwMCMjc2Z4KSA8PCAgOCkgfCBcCisJICgoKHgpICYgMHgwMDAwMDAwMDAwZmYwMDAwIyNzZngpIDw8IDI0KSB8IFwKKwkgKCgoeCkgJiAweDAwMDAwMDAwMDAwMGZmMDAjI3NmeCkgPDwgNDApIHwgXAorCSAoKCh4KSAmIDB4MDAwMDAwMDAwMDAwMDBmZiMjc2Z4KSA8PCA1NikpCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgZGVmaW5lIHVzd2FwXzY0KHgpIF91c3dhcF82NCh4LCB1bGwpCisjZWxzZQorIyBkZWZpbmUgdXN3YXBfNjQoeCkgX3Vzd2FwXzY0KHgsICkKKyNlbmRpZgorCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgY3B1X3RvX2xlMTYoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2xlMzIoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2xlNjQoeCkJCSh4KQorIyBkZWZpbmUgbGUxNl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgbGUzMl90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgbGU2NF90b19jcHUoeCkJCSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMTYoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBjcHVfdG9fYmUzMih4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGNwdV90b19iZTY0KHgpCQl1c3dhcF82NCh4KQorIyBkZWZpbmUgYmUxNl90b19jcHUoeCkJCXVzd2FwXzE2KHgpCisjIGRlZmluZSBiZTMyX3RvX2NwdSh4KQkJdXN3YXBfMzIoeCkKKyMgZGVmaW5lIGJlNjRfdG9fY3B1KHgpCQl1c3dhcF82NCh4KQorI2Vsc2UKKyMgZGVmaW5lIGNwdV90b19sZTE2KHgpCQl1c3dhcF8xNih4KQorIyBkZWZpbmUgY3B1X3RvX2xlMzIoeCkJCXVzd2FwXzMyKHgpCisjIGRlZmluZSBjcHVfdG9fbGU2NCh4KQkJdXN3YXBfNjQoeCkKKyMgZGVmaW5lIGxlMTZfdG9fY3B1KHgpCQl1c3dhcF8xNih4KQorIyBkZWZpbmUgbGUzMl90b19jcHUoeCkJCXVzd2FwXzMyKHgpCisjIGRlZmluZSBsZTY0X3RvX2NwdSh4KQkJdXN3YXBfNjQoeCkKKyMgZGVmaW5lIGNwdV90b19iZTE2KHgpCQkoeCkKKyMgZGVmaW5lIGNwdV90b19iZTMyKHgpCQkoeCkKKyMgZGVmaW5lIGNwdV90b19iZTY0KHgpCQkoeCkKKyMgZGVmaW5lIGJlMTZfdG9fY3B1KHgpCQkoeCkKKyMgZGVmaW5lIGJlMzJfdG9fY3B1KHgpCQkoeCkKKyMgZGVmaW5lIGJlNjRfdG9fY3B1KHgpCQkoeCkKKyNlbmRpZgorCisjZWxzZSAvKiAhVVNFX0hPU1RDQyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qIFR5cGVzIGZvciBgdm9pZCAqJyBwb2ludGVycy4gKi8KKyNpZiBfX1dPUkRTSVpFID09IDY0Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgIHVpbnRwdHJfdDsKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIHVpbnRwdHJfdDsKKyNlbmRpZgorCisjZW5kaWYKKworLyogY29tcGlsZXIgb3B0aW9ucyAqLworI2RlZmluZSB1bmluaXRpYWxpemVkX3Zhcih4KQkJeCA9IHgKKworI2RlZmluZSBsaWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwgMSkKKyNkZWZpbmUgdW5saWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ19kZWZhdWx0cy5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdfZGVmYXVsdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGYwNDhhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdfZGVmYXVsdHMuaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBjb25maWdfZGVmYXVsdHMuaCAtIHNhbmUgZGVmYXVsdHMgZm9yIGV2ZXJ5b25lCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgX0NPTkZJR19ERUZBVUxUU19IXworI2RlZmluZSBfQ09ORklHX0RFRkFVTFRTX0hfCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9hbTM1MTdldm0uaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9hbTM1MTdldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZiOTI2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2FtMzUxN2V2bS5oCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA5CisgKiBUZXhhcyBJbnN0cnVtZW50cywgPHd3dy50aS5jb20+CisgKiBNYW5pa2FuZGFuIFBpbGxhaTxtYW5pLnBpbGxhaUB0aS5jb20+CisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBBTTM1MTdFVk0gYm9hcmQuCisgKgorICogRGVyaXZlZCBmcm9tIC9pbmNsdWRlL2NvbmZpZ3Mvb21hcDNldm0uaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisKKyNkZWZpbmUgQ09ORklHX0FNMzUxN0VWTSAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBBTTM1MTcgRVZNICovCisvLyNkZWZpbmUgQ09ORklHX0FNMzUxN1RFQiAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBBTTM1MTcgVEVCICovCisKKy8qIEVuYWJsZSB0aGUgYmVsb3cgbWFjcm8gaWYgTU1DIGJvb3Qgc3VwcG9ydCBpcyByZXF1aXJlZCAqLworI2RlZmluZSBDT05GSUdfTU1DICAgICAgICAgICAgICAgMQorI2lmIGRlZmluZWQoQ09ORklHX01NQykKKwkjZGVmaW5lIENGR19DTURfTU1DICAgICAgICAgICAgICAxCisJI2RlZmluZSBDRkdfQ01EX0ZBVCAgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAyNjAwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIChWX09TQ0sgPj4gMSkKKyNlbHNlCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICBWX09TQ0sKKyNlbmRpZgorCisvLyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAxICAgIC8qIFZERDI9MS4xNXYgLSAxMzNNSHogRERSICovCisjZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMzMyTUhaICAgICAxICAgIC8qIFZERDI9MS4xNXYgLSAxNjZNSHogRERSICovCisjZGVmaW5lIFBSQ01fUENMS19PUFAyICAgICAgICAgICAxICAgIC8qIEFSTT0zODFNSHogLSBWREQxPTEuMjB2ICovCisKKyMgZGVmaW5lIE5BTkRfQkFTRV9BRFIgICAgICAgICAgIE5BTkRfQkFTRSAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFICAgICAgICAgICAgT05FTkFORF9NQVAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9ORU5BTkRfQUREUiBPTkVOQU5EX0JBU0UgIC8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgT25lTkFORCBhdCBDUzAqLworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRSAgICAgKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsgICAgICAgICAgKDQ4MDAwMDAwKQorI2RlZmluZSBDRkdfTlMxNjU1MF9DT00zICAgICAgICAgT01BUDM0WFhfVUFSVDMKKworLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDMgICAgICAgICAgIDMgICAgLyogVUFSVDEgb24gT01BUDNFVk0gKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDMKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBTYW1zdW5nIDgtYml0IDEyOE1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzE2QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAyM0ZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDI0MDAwMCAtIDB4MDAyN0ZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDI4MDAwMCAtIDB4MDA3N0ZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDc4MDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMjQwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKworI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorCisjaWYgZGVmaW5lZCAoQ09ORklHX0FNMzUxN0VWTSkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg3QykKKyNkZWZpbmUgR1BNQ19OQU5EX0FERFJFU1NfMCAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0RBVEFfMCAgICAgICAgIChPTUFQMzRYWF9HUE1DX0JBU0UrMHg4NCkKKyNlbGlmIGRlZmluZWQgKENPTkZJR19BTTM1MTdURUIpCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4REMpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4RTApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4RTQpCisjZW5kaWYKKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZW5kaWYKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKQorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKQorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFECTEKKworLyogT25lTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqICAgMHgwMDAwMDAwIC0gMHgwMDgwMDAwICBYLUxvYWRlcgorICogICAweDAwODAwMDAgLSAweDAyNDAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMjQwMDAwIC0gMHgwMjgwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDI4MDAwMCAtIDB4MDc4MDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDA3ODAwMDAgLSAweDgwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgMTgKKyNkZWZpbmUgT05FTkFORF9QQUdFX1NJWkUgICAgICAgIDIwNDggICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgMHgyMDAwMCAgLyogMTI4S0IgKi8KKworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQtdXNiLWxvYWRlci5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQtdXNiLWxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTI3NDEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC11c2ItbG9hZGVyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxNiBOZXN0IExhYnMsIEluYy4KKyAqCisgKiAgICBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogICAgcHJvamVjdC4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiAgICBEZXNjcmlwdGlvbjoKKyAqICAgICAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHgtbG9hZGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIHRoZQorICogICAgICBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQuCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fRElBTU9ORF9VU0JfTE9BREVSX0NPTkZJR19ICisjZGVmaW5lIF9fRElBTU9ORF9VU0JfTE9BREVSX0NPTkZJR19ICisKKyNpbmNsdWRlICJkaWFtb25kLmgiCisKKyNkZWZpbmUgQ09ORklHX1VTQiAxCisKKyNlbmRpZiAvKiBfX0RJQU1PTkRfVVNCX0xPQURFUl9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvZGlhbW9uZC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTZmZTEyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2RpYW1vbmQuaApAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBib2FyZC4KKyAqCisgKiAgICAgIFRoZSBmaWxlIHdhcyBvcmlnaW5hbGx5IGRlcml2ZWQgZnJvbSBvbWFwM2V2bS5oLgorICoKKyAqICAgICAgU0RSQU0gQ29udHJvbGxlciAoU0RSQyk6CisgKiAgICAgICAgLSBTYW1zdW5nIEs0WDUxMTYzUEktRkNHNiA2NCBNaUIgRERSIFNEUkFNCisgKgorICogICAgICBHZW5lcmFsIFB1cnBvc2UgTWVtb3J5IENvbnRyb2xsZXIgKEdQTUMpOgorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCREhDLUVUIDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gTWljcm9uIE1UMjlGMkcxNkFCQkVBSDQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoTm9uLWRldmVsb3BtZW50KQorICogICAgICAgIC0gU2Ftc3VuZyBLOUY0RzA4VTBDIDUxMiBNaUIgU0xDIE5BTkQgRmxhc2ggKERldmVsb3BtZW50KQorICogICAgICAgIC0gU01TQyBMQU45MjIwIDEwLzEwMCBNYml0IEV0aGVybmV0IE1BQyBhbmQgUEhZIChEZXZlbG9wbWVudCkKKyAqCisgKiAgICAgIE11bHRpbWVkaWEgQ2FyZCAoTU1DKSBJbnRlcmZhY2U6CisgKiAgICAgICAgLSBNb2xleCA1MDA5OTgtMDkwMCBTZWN1cmUgRGlnaXRhbCAoU0QpIENvbm5lY3RvcgorICogICAgICAgIC0gVEkgV0wxMjcwIFdpcmVsZXNzIExBTiAoV0xBTikgTW9kdWxlCisgKgorICogICAgICBEaXNwbGF5IFN1YnN5c3RlbSAoRFNTKToKKyAqICAgICAgICAtIFNhbXN1bmcgTE1TMzUwREYwMyBIVkdBICgzMjAgeCA0ODApIExDTSAoRGV2ZWxvcG1lbnQgYW5kIFByb3RvdHlwZSkKKyAqICAgICAgICAtIFRpYW5tYSBUTTAyNVpEWjAxICgzMjAgeCAzMjApIExDTSAoUHJvZHVjdGlvbikKKyAqCisgKiAgICAgIENhbWVyYSBJbWFnZSBTaWduYWwgUHJvY2Vzc29yOgorICogICAgICAgIC0gVW51c2VkCisgKgorICogICAgICBVQVJUIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgICAgICogSGVhZCBVbml0IFNlcmlhbCBDb25zb2xlCisgKgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgICAgICAqIFppZ0JlZSBXaXJlbGVzcyBNb2R1bGUKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBCdWZmZXJlZCBTZXJpYWwgUG9ydCAoTWNCU1ApOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICogICAgICAgIC0gQ2hhbm5lbCA0OgorICogICAgICAgIC0gQ2hhbm5lbCA1OgorICoKKyAqICAgICAgTXVsdGljaGFubmVsIFNlcmlhbCBQZXJpcGhlcmFsIEludGVyZmFjZSAoTWNTUEkpOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgIC0gQ2hhbm5lbCAyOgorICogICAgICAgIC0gQ2hhbm5lbCAzOgorICoKKyAqICAgICAgR1BJTyBDb250cm9sbGVyOgorICogICAgICAgIC0gQmFja3BsYXRlIERldGVjdAorICogICAgICAgIC0gWmlnQmVlCisgKi8KKworI2lmbmRlZiBfX0RJQU1PTkRfQ09ORklHX0gKKyNkZWZpbmUgX19ESUFNT05EX0NPTkZJR19ICisKKy8qCisgKiBBUk0gUHJvY2Vzc29yIEFyY2hpdGVjdHVyZSwgRmFtaWx5IGFuZCBQcm9kdWN0IENvbmZpZ3VyYXRpb24KKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTgJCTEKKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAxCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgIDEKKworLyoKKyAqIFdpdGggdGhlIGFyY2hpdGVjdHVyZSwgZmFtaWx5IGFuZCBwcm9kdWN0IGNvbmZpZ3VyYXRpb24gZGVmaW5lZCwKKyAqIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIENQVSBoZWFkZXIgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisKKy8qCisgKiBBc3NlcnQgdGhlIGJvYXJkIHR5cGUocykgd2UgYXJlIGJ1aWxkaW5nIGZvci4KKyAqCisgKi8KKyN1bmRlZiBDT05GSUdfRElBTU9ORF9CT0FSRF9ERVZFTE9QTUVOVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX1BST1RPVFlQRQorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0VWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX1BWVAorI3VuZGVmIENPTkZJR19ESUFNT05EX0JPQVJEX01QCisjZGVmaW5lIENPTkZJR19ESUFNT05EX0JPQVJEX01VTFRJCQkJMQorCisvKgorICogRW5hYmxlIHNlcmlhbCBjb25zb2xlIHByaW50ZiBmYWNpbGl0eSAoY29uc3VtZXMgYWJvdXQgMy41IEtpQikKKyAqLworI2RlZmluZSBDRkdfUFJJTlRGCisKKy8qCisgKiBDT05GSUdfQk9PVE1fSU1BR0UgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBYLUxvYWRlcgorICogc3VwcG9ydHMgYm9vdGluZyBmcm9tICdta2ltYWdlJyB1LWJvb3QgaW1hZ2UgZmlsZXMgcmF0aGVyIHRoYW4ganVzdAorICogcmF3LCB1LWJvb3QgYmluYXJpZXMuCisgKgorICogRW5hYmxpbmcgdGhpcyBhZGRzIHN1cHBvcnQgZm9yIGF0dGVtcHRpbmcgdG8gYm9vdCBmcm9tIG9uZSBvciBtb3JlCisgKiBpbWFnZXMgYmVjYXVzZSBpdCBhbGxvd3MgYW4gaW1hZ2UgdG8gYmUgc2FuaXR5LWNoZWNrZWQgYmVmb3JlCisgKiBhdHRlbXB0aW5nIHRvIGJvb3QgaXQuCisgKi8KKyNkZWZpbmUgQ09ORklHX0JPT1RNX0lNQUdFCisKKy8qCisgKiBEaXNwbGF5IGltYWdlIGluZm9ybWF0aW9uIHdpdGggdGltZXN0YW1wcworICovCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lCUNPTkZJR19USU1FU1RBTVAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDRkdfUFJJTlRGKQorLyoKKyAqIFVzZSBhIHByaW50ZiBidWZmZXIgc2l6ZSBvZiAyNTYgQgorICovCisjIGRlZmluZSBDRkdfUEJTSVpFCQkJCTI1NgorCisvKgorICogSW5kaWNhdGUgdGhhdCB3ZSB3YW50IHRvIHVzZSBDRkdfTlMxNjU1MF9DT00xIChzZWUgYmVsb3cpIGF0IGEgYmF1ZAorICogcmF0ZSBvZiAxMTUsMjAwIGJwcyBmb3IgdGhlIHNlcmlhbCBjb25zb2xlLgorICovCisjIGRlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgIDEKKyMgZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgMTE1MjAwCisKKy8qCisgKiBOUzE2NTUwLWNvbXBhdGlibGUgc2VyaWFsIGRyaXZlciBjb25maWd1cmF0aW9uCisgKi8KKyMgZGVmaW5lIENGR19OUzE2NTUwCisjIGRlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyMgZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgKC00KQorIyBkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAoNDgwMDAwMDApCisjIGRlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgIE9NQVAzNFhYX1VBUlQxCisjZW5kaWYgLyogZGVmaW5lZChDRkdfUFJJTlRGKSAqLworCisvKgorICogRGlzYWJsZSB0aW1lci1iYXNlZCBkZWxheSAoY29uc3VtZXMgYWJvdXQgMjUwIEIpIHNpbmNlIHRoaXMgaXMgb25seQorICogYXZhaWxhYmxlIGF0IHByZXNlbnQgb24gdGhlIEFSTTkyNkVKUy4KKyAqLworI3VuZGVmCUNGR19VREVMQVkKKworLyoKKyAqIFRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgZGV2ZWxvcG1lbnQgYm9hcmQgaGFzIGFuIFNEL01NQworICogY29ubmVjdG9yLCBzbyBlbmFibGUgc3VwcG9ydCBmb3IgaXQsIHdoaWNoIGltcGxpY2l0bHkgZW5hYmxlcworICogcnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgTVMtRE9TIChNQlIpIHBhcnRpdGlvbnMgYW5kIEZBVCBmaWxlCisgKiBzeXN0ZW1zLgorICovCisjZGVmaW5lIENPTkZJR19NTUMJCQkJMQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorIyBkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAxCisjIGRlZmluZSBDRkdfQ01EX0ZBVCAgICAgICAgICAgIDEKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19NTUMpICovCisKKy8qCisgKiBDbG9jayBDb25maWd1cmF0aW9uCisgKgorICogIENob29zZSBQUkNNIENvbmZpZ3VyYXRpb24gMiB3aGljaCBzdWJzZWxlY3RzIGEgTDMgaW50ZXJjb25uZWN0CisgKiAgY2xvY2sgb2YgMTY2IE1IeiBmb3IgU0RSQU0uCisgKi8KKworI3VuZGVmIENGR19QUkNNX0RFQlVHCisKKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIAkJMQorCisjZGVmaW5lCUNPTkZJR19TWVNfTVBVX0RQTExfMzAwTUhaCQkxCisjdW5kZWYJQ09ORklHX1NZU19NUFVfRFBMTF82MDBNSFoKKworI2RlZmluZQlDT05GSUdfU1lTX0NPUkVfRFBMTF8zMzJNSFoJCTEKKyN1bmRlZglDT05GSUdfU1lTX0NPUkVfRFBMTF8yMDBNSFoKKyN1bmRlZglDT05GSUdfU1lTX0NPUkVfRFBMTF80MDBNSFoKKworI2RlZmluZSBDRkdfU0RSQU1fU0laRV9NQgkJCQk2NAorI3VuZGVmIENGR19TRFJBTV9ERUJVRworCisvKgorICogVGhlIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBtYXkgaGF2ZSBvbmUgb2YgdGhyZWUgU0RSQU1zCisgKiAxYSlTYW1zdW5nIEktRGllIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICogCisgKiAxYilTYW1zdW5nIEstRGllIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICoKKyAqIDIpIE5hbnlhIE5UNkRNIDY0TUIKKyAqICAgIDMyTWJ4MTYKKyAqICAgIFZERD0xLjhWCisgKiAgICA2bnMgY3ljbGUgdGltZQorICogICAgQ0w9MworICoKKyAqLworCisjdW5kZWYgQ0ZHX1NEUkFNX1NNR19LNFgKKyN1bmRlZiBDRkdfU0RSQU1fTllBX05URDYKKyNkZWZpbmUgQ0ZHX1NEUkFNX0NPTUJJTkVECisvKgorICogVGhlc2UgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgU2Ftc3VuZyBLNFg1MTE2M1BLLUZHQzYgZGF0YXNoZWV0IAorICogKGFwcGxpY2FibGUgdG8gdGhlIEktZGllIGFuZCB0aGUgSy1kaWUpIGFuZCB0aGUgVEkgc3ByZWFkc2hlZXQgCisgKiBhdCBodHRwOi8vcHJvY2Vzc29ycy53aWtpLnRpLmNvbS9pbmRleC5waHA/dGl0bGU9CisgKiBTZXR0aW5nX3VwX0FNMzd4X1NEUkNfcmVnaXN0ZXJzLgorICovCisjaWYgZGVmaW5lZChDRkdfU0RSQU1fU01HX0s0WCkKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQwkJMTIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDCQkxMAorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTCQkgNworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlAJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwJCSA1CisKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFdUUgkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVENLRQkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhQCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFNSCQkyMAorI2VuZGlmCisKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBOYW55YSBOVDZETSBkYXRhc2hlZXQgYW5kIHRoZSBUSQorICogc3ByZWFkc2hlZXQgYXQgaHR0cDovL3Byb2Nlc3NvcnMud2lraS50aS5jb20vaW5kZXgucGhwP3RpdGxlPQorICogU2V0dGluZ191cF9BTTM3eF9TRFJDX3JlZ2lzdGVycy4KKyAqLworI2lmIGRlZmluZWQoQ0ZHX1NEUkFNX05ZQV9OVEQ2KQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkZDCQkxMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkMJCTEwCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQVMJCSA3CisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDRAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJSRAkJIDIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERQTAkJIDMKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVERBTAkgICAgICAgICA2CQorCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RXVFIJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RDS0UJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYUAkJIDEKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEJfVFhTUgkJMTkKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKENGR19TRFJBTV9DT01CSU5FRCkKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJGQwkJMTIKKyNkZWZpbmUgQ0ZHX1NEUkNfQUNUSU1fQ1RSTEFfVFJDCQkxMAorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUkFTCQkgNworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQV9UUlAJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSQ0QJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1RSUkQJCSAyCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REUEwJCSAzCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxBX1REQUwJICAgICAgICAgNgkKKworI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UV1RSCQkgMQorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UQ0tFCQkgMgorI2RlZmluZSBDRkdfU0RSQ19BQ1RJTV9DVFJMQl9UWFAJCSAxCisjZGVmaW5lIENGR19TRFJDX0FDVElNX0NUUkxCX1RYU1IJICAgICAgICAyMAkKKyNlbmRpZgorCisKKworLyoKKyAqIE5BTkQgQ29uZmlndXJhdGlvbgorICoKKyAqIFRoZSBOZXN0IExlYXJuaW5nIFRoZXJtb3N0YXQgYm9hcmQgbWF5IGhhdmUgdHdvIE5BTkQgZGV2aWNlczoKKyAqCisgKiAgIDFhKSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgQCBHUE1DIENTMAorICoKKyAqICAgICAgLSAyIEdiIHggMTYgKDI1NiBNaUIpCisgKiAgICAgIC0gMiBLaUIgcGFnZSBzaXplCisgKiAgICAgIC0gMTI4IEtpQiBlcmFzZSBzaXplCisgKiAgICAgIC0gMS44VgorICogICAgICAtIFNMQworICogICAgICAtIDEtYml0IEVDQworICoKKyAqICAgMWIpIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IEAgR1BNQyBDUzAKKyAqCisgKiAgICAgIC0gMiBHYiB4IDE2ICgyNTYgTWlCKQorICogICAgICAtIDIgS2lCIHBhZ2Ugc2l6ZQorICogICAgICAtIDEyOCBLaUIgZXJhc2Ugc2l6ZQorICogICAgICAtIDEuOFYKKyAqICAgICAgLSBTTEMKKyAqICAgICAgLSA0LWJpdCBFQ0MKKyAqCisgKiAgIDIpIFNhbXN1bmcgSzlGNEcwOFUwQyBAIEdQTUMgQ1MzCisgKgorICogICAgICAtIDQgR2IgeCA4ICg1MTIgTWlCKQorICogICAgICAtIDIgS2lCIHBhZ2Ugc2l6ZQorICogICAgICAtIDEyOCBLaUIgZXJhc2Ugc2l6ZQorICogICAgICAtIDMuM1YKKyAqICAgICAgLSBTTEMKKyAqLworCisjZGVmaW5lIENGR19HUE1DX05BTkQKKyNkZWZpbmUgQ0ZHX01NQ19OQU5ECisjdW5kZWYJQ0ZHX0dQTUNfT05FTkFORAorI3VuZGVmCUNGR19NTUNfT05FTkFORAorCisjdW5kZWYgQ0ZHX0dQTUNfREVCVUcKKworI3VuZGVmCUNGR19OQU5EX0s5RjRHMDhVMEMJCS8vIFNhbXN1bmcgSzlGNEcwOFUwQworI2RlZmluZSBDRkdfTkFORF9NVDI5RjJHMTYJCS8vIE1pY3JvbiBNVDI5RjJHMTYKKworI3VuZGVmICBDRkdfTkFORF9FQ0NfMUJJVAorI2RlZmluZSBDRkdfTkFORF9FQ0NfNEJJVAkxCisjdW5kZWYgIENGR19OQU5EX0VDQ184QklUCisKKyNkZWZpbmUgQ0ZHX0dQTUNfTkFORF9CQVNFCU5BTkRfQkFTRQorI2RlZmluZSBDRkdfR1BNQ19OQU5EX1NJWkUJR1BNQ19TSVpFXzEyOE0KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfTVQyOUYyRzE2KQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcxXzAJTV9OQU5EX0dQTUNfQ09ORklHMQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUcyXzAJTV9OQU5EX0dQTUNfQ09ORklHMgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUczXzAJTV9OQU5EX0dQTUNfQ09ORklHMworI2RlZmluZSBDRkdfR1BNQ19DT05GSUc0XzAJTV9OQU5EX0dQTUNfQ09ORklHNAorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc1XzAJTV9OQU5EX0dQTUNfQ09ORklHNQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc2XzAJTV9OQU5EX0dQTUNfQ09ORklHNgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc3XzAJXAorCShHUE1DX0NPTkZJRzdfTUFTS0FERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfU0laRSkgfCBcCisJIEdQTUNfQ09ORklHN19CQVNFQUREUkVTU19FTkNPREUoQ0ZHX0dQTUNfTkFORF9CQVNFKSkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikgKi8KKworI2lmIGRlZmluZWQoQ0ZHX05BTkRfSzlGNEcwOFUwQykKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHMV8zCU1fTkFORF9HUE1DX0NPTkZJRzEgLy9TTU5BTkRfR1BNQ19DT05GSUcxCisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzJfMwlNX05BTkRfR1BNQ19DT05GSUcyIC8vU01OQU5EX0dQTUNfQ09ORklHMgorI2RlZmluZSBDRkdfR1BNQ19DT05GSUczXzMJTV9OQU5EX0dQTUNfQ09ORklHMyAvL1NNTkFORF9HUE1DX0NPTkZJRzMKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHNF8zCU1fTkFORF9HUE1DX0NPTkZJRzQgLy9TTU5BTkRfR1BNQ19DT05GSUc0CisjZGVmaW5lIENGR19HUE1DX0NPTkZJRzVfMwlNX05BTkRfR1BNQ19DT05GSUc1IC8vU01OQU5EX0dQTUNfQ09ORklHNQorI2RlZmluZSBDRkdfR1BNQ19DT05GSUc2XzMJTV9OQU5EX0dQTUNfQ09ORklHNiAvL1NNTkFORF9HUE1DX0NPTkZJRzYKKyNkZWZpbmUgQ0ZHX0dQTUNfQ09ORklHN18zCVwKKwkoR1BNQ19DT05GSUc3X01BU0tBRERSRVNTX0VOQ09ERShDRkdfR1BNQ19OQU5EX1NJWkUpIHwgXAorCSBHUE1DX0NPTkZJRzdfQkFTRUFERFJFU1NfRU5DT0RFKENGR19HUE1DX05BTkRfQkFTRSkpCisjZW5kaWYgLyogZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKSAqLworCisvKgorICogQXJjaGl0ZWN0dXJlLCBwcm9jZXNzb3IgYW5kL29yIGJvYXJkLXNwZWNpZmljIE5BTkQgYWNjZXNzIG1hY3JvcworICogYW5kIGRyaXZlciBwYXJhbWV0ZXJzLgorICovCisKKyNpZiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikKKyMgZGVmaW5lIE5BTkRfMTZCSVQKKyMgZGVmaW5lIE5BTkRfQkxPQ0tfU0laRQkoMTI4IDw8IDEwKQorI2VsaWYgZGVmaW5lZChDRkdfTkFORF9LOUY0RzA4VTBDKQorIyB1bmRlZglOQU5EXzE2QklUCisjIGRlZmluZSBOQU5EX0JMT0NLX1NJWkUJKDEyOCA8PCAxMCkKKyNlbmRpZiAvKiBkZWZpbmVkKENGR19OQU5EX01UMjlGMkcxNikgKi8KKworI2lmZGVmIE5BTkRfMTZCSVQKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IEdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+R1BNQ19XUklURVBST1RFQ1RfSElHSDt9IHdoaWxlKDApCisKKyNlbHNlIC8qIHRvIHN1cHBvcnQgOC1iaXQgTkFORCBkZXZpY2VzICovCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0RBVEFfMCk7CisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSBHUE1DX1dSSVRFUFJPVEVDVF9ISUdIO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfkdQTUNfV1JJVEVQUk9URUNUX0hJR0g7fSB3aGlsZSgwKQorI2VuZGlmIC8qIE5BTkRfMTZCSVQgKi8KKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKQorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKQorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKQorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpCisKKy8qCisgKiBMb2NhdGlvbiB3aGVyZSB3ZSBleHBlY3QgdG8gZmluZCB0aGUgc2Vjb25kLXN0YWdlIGJvb3QgbG9hZGVyIGluCisgKiB0aGUgYm9vdCBOQU5EIGRldmljZS4KKyAqCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgQWxpYXMgRGVzY3JpcHRpb24gICAgICAgICAgICBTaXplICAgIEJsb2NrcyAgQmxvY2sgICAgIEFkZHJlc3MgICAgIFNpemUKKyAqICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgIGlwbAkgWC1Mb2FkZXIgSW1hZ2UJICAgICAgMjU2IEtpQiAgICAgIDIgICAgICAwCSAgMHgwMDAwMDAwMCAgICAwIEIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIHNwbDAJIFByaW1hcnkgVS1Cb290IEltYWdlIDEuNSBNaUIgICAgIDEyICAgICAgMgkgIDB4MDAwNDAwMDAgIDI1NiBLaUIKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIHNwbDEJIFJlc2VydmVkIGZvciBGdXR1cmUgIDEuNSBNaUIgICAgIDEyICAgICAxNAkgIDB4MDAxQzAwMDAgMS43NSBNaUIKKyAqICAgICAgICAgICBTZWNvbmRhcnkgVS1Cb290CisgKiAgICAgICAgICAgSW1hZ2UKKyAqICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVDBfU1RBUlQJCTB4MDAwNDAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVDFfU1RBUlQJCTB4MDAxQzAwMDAKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVEVYVEVOVF9TSVpFCQkweDE4MDAwMAorCisjaWZkZWYgQ09ORklHX0JPT1RNX0lNQUdFCisjZGVmaW5lIENPTkZJR19OQU5EX0JPT1RFWFRFTlRfTElTVAkJeyB7IENGR19OQU5EX0JPT1RFWFRFTlQwX1NUQVJULCBcCisJCQkJCQkJCQkJCUNGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9LAlcCisJCQkJCQkJCQkJICB7IENGR19OQU5EX0JPT1RFWFRFTlQxX1NUQVJULCBcCisJCQkJCQkJCQkJCUNGR19OQU5EX0JPT1RFWFRFTlRfU0laRSB9IH0KKyNlbHNlCisjZGVmaW5lIENPTkZJR19OQU5EX0JPT1RFWFRFTlQJCQl7IENGR19OQU5EX0JPT1RFWFRFTlQwX1NUQVJULCBcCisJCQkJCQkJCQkJICBDRkdfTkFORF9CT09URVhURU5UX1NJWkUgfQorI2VuZGlmCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKworLyoKKyAqIENPTkZJR19CT09URklMRSAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgKiBzZWNvbmQtc3RhZ2UgYm9vdCBmaWxlIGxvYWRlZCBmcm9tIFNEIGNhcmQgaWYgdGhlIHN5c3RlbSBoYXMgYmVlbgorICogY29uZmlndXJlZCB0byBib290IGFzIHN1Y2guCisgKgorICogQ09ORklHX0JPT1RGSUxFX0xJU1QgLSBUaGlzIGNhbiBiZSB1c2VkIHRvIGEgbGlzdCBvZiBkZWZhdWx0IHZhbHVlcworICogZm9yIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBmaWxlIGxvYWRlZCBmcm9tIFNEIGNhcmQgaWYgdGhlIHN5c3RlbSBoYXMgYmVlbgorICogY29uZmlndXJlZCB0byBib290IGFzIHN1Y2guCisgKgorICogVHJ5IHRvIGJvb3QgYW4gJ21raW1hZ2UnIHUtYm9vdCBpbWFnZSBmaXJzdDsgb3RoZXJ3aXNlLCB0cnkgdG8gYm9vdCBhCisgKiByYXcgdS1ib290IGJpbmFyeSBpZiBpdCBleGlzdHMgYXMgYSBmYWxsYmFjay4KKyAqLworI2lmZGVmIENPTkZJR19CT09UTV9JTUFHRQorI2RlZmluZSBDT05GSUdfQk9PVEZJTEVfTElTVCAJCQl7ICJ1LWJvb3QuaW1nIiwgInUtYm9vdC5iaW4iIH0KKyNlbHNlCisjZGVmaW5lIENPTkZJR19CT09URklMRQkJCQkJInUtYm9vdC5pbWciCisjZW5kaWYKKworLyoKKyAqIExvY2F0aW9uIGluIFNEUkFNIHdoZXJlIHRoZSBzZWNvbmQtc3RhZ2UgYm9vdCBsb2FkZXIgd2lsbCBiZSBsb2FkZWQKKyAqIHRvIGFuZCBleGVjdXRlZCBmcm9tLgorICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAJCTB4ODAwMDgwMDAKKworI2VuZGlmIC8qIF9fRElBTU9ORF9DT05GSUdfSCAqLworCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LXVzYi1sb2FkZXIuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDktdXNiLWxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMTRjN2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3MvajQ5LXVzYi1sb2FkZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDEyIE5lc3QgTGFicywgSW5jLgorICoKKyAqICAgIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiAgICBwcm9qZWN0LgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiAgICBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqICAgIERlc2NyaXB0aW9uOgorICogICAgICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgeC1sb2FkZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlCisgKiAgICAgIE5lc3QgTGVhcm5pbmcgVGhlcm1vc3RhdCBKNDkgYm9hcmQuICBUaGUgaXRlbXMgYmVsb3cgc2hvdWxkCisgKiAgICAgIGJlIHVwZGF0ZWQgYXMgdGhlIGhhcmR3YXJlIHNldHRsZXMuCisgKgorICogICAgICBTRFJBTSBDb250cm9sbGVyIChTRFJDKToKKyAqICAgICAgICAtIFNhbXN1bmcgSzRYNTExNjNQSS1GQ0c2IDY0IE1pQiBERFIgU0RSQU0KKyAqCisgKiAgICAgIEdlbmVyYWwgUHVycG9zZSBNZW1vcnkgQ29udHJvbGxlciAoR1BNQyk6CisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJESEMtRVQgMjU2IE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBNaWNyb24gTVQyOUYyRzE2QUJCRUFINCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChOb24tZGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTYW1zdW5nIEs5RjRHMDhVMEMgNTEyIE1pQiBTTEMgTkFORCBGbGFzaCAoRGV2ZWxvcG1lbnQpCisgKiAgICAgICAgLSBTTVNDIExBTjkyMjAgMTAvMTAwIE1iaXQgRXRoZXJuZXQgTUFDIGFuZCBQSFkgKERldmVsb3BtZW50KQorICoKKyAqICAgICAgTXVsdGltZWRpYSBDYXJkIChNTUMpIEludGVyZmFjZToKKyAqICAgICAgICAtIE1vbGV4IDUwMDk5OC0wOTAwIFNlY3VyZSBEaWdpdGFsIChTRCkgQ29ubmVjdG9yCisgKiAgICAgICAgLSBUSSBXTDEyNzAgV2lyZWxlc3MgTEFOIChXTEFOKSBNb2R1bGUKKyAqCisgKiAgICAgIERpc3BsYXkgU3Vic3lzdGVtIChEU1MpOgorICogICAgICAgIC0gU2Ftc3VuZyBMTVMzNTBERjAzIEhWR0EgKDMyMCB4IDQ4MCkgTENNIChEZXZlbG9wbWVudCBhbmQgUHJvdG90eXBlKQorICogICAgICAgIC0gVGlhbm1hIFRNMDI1WkRaMDEgKDMyMCB4IDMyMCkgTENNIChQcm9kdWN0aW9uKQorICoKKyAqICAgICAgQ2FtZXJhIEltYWdlIFNpZ25hbCBQcm9jZXNzb3I6CisgKiAgICAgICAgLSBVbnVzZWQKKyAqCisgKiAgICAgIFVBUlQgQ29udHJvbGxlcjoKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAgICAgKiBIZWFkIFVuaXQgU2VyaWFsIENvbnNvbGUKKyAqCisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgICAgICogWmlnQmVlIFdpcmVsZXNzIE1vZHVsZQorICoKKyAqICAgICAgTXVsdGljaGFubmVsIEJ1ZmZlcmVkIFNlcmlhbCBQb3J0IChNY0JTUCk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKiAgICAgICAgLSBDaGFubmVsIDQ6CisgKiAgICAgICAgLSBDaGFubmVsIDU6CisgKgorICogICAgICBNdWx0aWNoYW5uZWwgU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChNY1NQSSk6CisgKiAgICAgICAgLSBDaGFubmVsIDE6CisgKiAgICAgICAgLSBDaGFubmVsIDI6CisgKiAgICAgICAgLSBDaGFubmVsIDM6CisgKgorICogICAgICBHUElPIENvbnRyb2xsZXI6CisgKiAgICAgICAgLSBCYWNrcGxhdGUgRGV0ZWN0CisgKiAgICAgICAgLSBaaWdCZWUKKyAqLworCisjaWZuZGVmIF9fSjQ5X0NPTkZJR19ICisjZGVmaW5lIF9fSjQ5X0NPTkZJR19ICisKKyNpbmNsdWRlICJkaWFtb25kLmgiCisKKy8qCisgKiBBc3NlcnQgdGhlIGJvYXJkIHR5cGUocykgd2UgYXJlIGJ1aWxkaW5nIGZvci4KKyAqCisgKi8KKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BST1RPVFlQRQorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfRVZUCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9EVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX1BSRV9QVlQKKyNkZWZpbmUgQ09ORklHX0o0OV9CT0FSRF9NVUxUSQkJCTEKKworI2RlZmluZSBDT05GSUdfVVNCIDEKKworI2VuZGlmIC8qIF9fSjQ5X0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDkuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9qNDkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODY1OGRjCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL2o0OS5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTIgTmVzdCBMYWJzLCBJbmMuCisgKgorICogICAgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqICAgIHByb2plY3QuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqICAgIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB4LWxvYWRlciBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUKKyAqICAgICAgTmVzdCBMZWFybmluZyBUaGVybW9zdGF0IEo0OSBib2FyZC4gIFRoZSBpdGVtcyBiZWxvdyBzaG91bGQKKyAqICAgICAgYmUgdXBkYXRlZCBhcyB0aGUgaGFyZHdhcmUgc2V0dGxlcy4KKyAqCisgKiAgICAgIFNEUkFNIENvbnRyb2xsZXIgKFNEUkMpOgorICogICAgICAgIC0gU2Ftc3VuZyBLNFg1MTE2M1BJLUZDRzYgNjQgTWlCIEREUiBTRFJBTQorICoKKyAqICAgICAgR2VuZXJhbCBQdXJwb3NlIE1lbW9yeSBDb250cm9sbGVyIChHUE1DKToKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkRIQy1FVCAyNTYgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIE1pY3JvbiBNVDI5RjJHMTZBQkJFQUg0IDI1NiBNaUIgU0xDIE5BTkQgRmxhc2ggKE5vbi1kZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNhbXN1bmcgSzlGNEcwOFUwQyA1MTIgTWlCIFNMQyBOQU5EIEZsYXNoIChEZXZlbG9wbWVudCkKKyAqICAgICAgICAtIFNNU0MgTEFOOTIyMCAxMC8xMDAgTWJpdCBFdGhlcm5ldCBNQUMgYW5kIFBIWSAoRGV2ZWxvcG1lbnQpCisgKgorICogICAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgSW50ZXJmYWNlOgorICogICAgICAgIC0gTW9sZXggNTAwOTk4LTA5MDAgU2VjdXJlIERpZ2l0YWwgKFNEKSBDb25uZWN0b3IKKyAqICAgICAgICAtIFRJIFdMMTI3MCBXaXJlbGVzcyBMQU4gKFdMQU4pIE1vZHVsZQorICoKKyAqICAgICAgRGlzcGxheSBTdWJzeXN0ZW0gKERTUyk6CisgKiAgICAgICAgLSBTYW1zdW5nIExNUzM1MERGMDMgSFZHQSAoMzIwIHggNDgwKSBMQ00gKERldmVsb3BtZW50IGFuZCBQcm90b3R5cGUpCisgKiAgICAgICAgLSBUaWFubWEgVE0wMjVaRFowMSAoMzIwIHggMzIwKSBMQ00gKFByb2R1Y3Rpb24pCisgKgorICogICAgICBDYW1lcmEgSW1hZ2UgU2lnbmFsIFByb2Nlc3NvcjoKKyAqICAgICAgICAtIFVudXNlZAorICoKKyAqICAgICAgVUFSVCBDb250cm9sbGVyOgorICogICAgICAgIC0gQ2hhbm5lbCAxOgorICogICAgICAgICAgICAqIEhlYWQgVW5pdCBTZXJpYWwgQ29uc29sZQorICoKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAgICAgKiBaaWdCZWUgV2lyZWxlc3MgTW9kdWxlCisgKgorICogICAgICBNdWx0aWNoYW5uZWwgQnVmZmVyZWQgU2VyaWFsIFBvcnQgKE1jQlNQKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqICAgICAgICAtIENoYW5uZWwgNDoKKyAqICAgICAgICAtIENoYW5uZWwgNToKKyAqCisgKiAgICAgIE11bHRpY2hhbm5lbCBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKE1jU1BJKToKKyAqICAgICAgICAtIENoYW5uZWwgMToKKyAqICAgICAgICAtIENoYW5uZWwgMjoKKyAqICAgICAgICAtIENoYW5uZWwgMzoKKyAqCisgKiAgICAgIEdQSU8gQ29udHJvbGxlcjoKKyAqICAgICAgICAtIEJhY2twbGF0ZSBEZXRlY3QKKyAqICAgICAgICAtIFppZ0JlZQorICovCisKKyNpZm5kZWYgX19KNDlfQ09ORklHX0gKKyNkZWZpbmUgX19KNDlfQ09ORklHX0gKKworI2luY2x1ZGUgImRpYW1vbmQuaCIKKworLyoKKyAqIEFzc2VydCB0aGUgYm9hcmQgdHlwZShzKSB3ZSBhcmUgYnVpbGRpbmcgZm9yLgorICoKKyAqLworI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJPVE9UWVBFCisjdW5kZWYgQ09ORklHX0o0OV9CT0FSRF9FVlQKKyN1bmRlZiBDT05GSUdfSjQ5X0JPQVJEX0RWVAorI3VuZGVmIENPTkZJR19KNDlfQk9BUkRfUFJFX1BWVAorI2RlZmluZSBDT05GSUdfSjQ5X0JPQVJEX01VTFRJCQkJMQorCisjZW5kaWYgLyogX19KNDlfQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDE1MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRlYWNlCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNTEwLmgKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKgorICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCisgKiAgIE9NQVAgaGFyZHdhcmUgbWFwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuIChodHRwOi8vd3d3LnJpZGdlcnVuLmNvbSkKKyAqIEF1dGhvcjogUmlkZ2VSdW4sIEluYy4KKyAqCSAgIEdyZWcgTG9ubm9uIChnbG9ubm9uQHJpZGdlcnVuLmNvbSkgb3IgaW5mb0ByaWRnZXJ1bi5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZgkgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUJTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQJICBgYEFTCUlTJycgQU5EICAgQU5ZCUVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsCSAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PCUVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFCSBMSUFCTEUgRk9SIEFOWQkgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQJICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMJT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsCU9SIFBST0ZJVFM7IE9SCUJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4JIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hcmNoL3NpemVzLmg+CisKKy8qCisgIFRoZXJlIGFyZSAyIHNldHMgb2YgZ2VuZXJhbCBJL08gLS0+CisgIDEuIEdQSU8gKHNoYXJlZCBiZXR3ZWVuIEFSTSAmIERTUCwgY29uZmlndXJlZCBieSBBUk0pCisgIDIuIE1QVUlPIHdoaWNoIGNhbiBiZSB1c2VkIG9ubHkgYnkgdGhlIEFSTS4KKworICBCYXNlIGFkZHJlc3MgRkZGQjo1MDAwIGlzIHdoZXJlIHRoZSBBUk0gYWNjZXNzZXMgdGhlIE1QVUlPIGNvbnRyb2wgcmVnaXN0ZXJzCisgIChzZWUgNy4yLjIgb2YgdGhlIFRSTSBmb3IgTVBVSU8gcmVnIGRlZmluaXRpb25zKS4KKworICBCYXNlIGFkZHJlc3MgRTEwMTo1MDAwIGlzIHJlc2VydmVkIGZvciBBUk0gYWNjZXNzIG9mIHRoZSBzYW1lIE1QVUlPIGNvbnRyb2wKKyAgcmVncywgYnV0IHZpYSB0aGUgRFNQIEkvTyBtYXAuICBUaGlzIGFkZHJlc3MgaXMgdW5hdmFpbGFibGUgb24gMTUxMC4KKworICBCYXNlIGFkZHJlc3MgRkZGQzpFMDAwIGlzIHdoZXJlIHRoZSBBUk0gYWNjZXNzZXMgdGhlIEdQSU8gY29uZmlnIHJlZ2lzdGVycworICBkaXJlY3RseSB2aWEgaXRzIG93biBwZXJpcGhlcmFsIGJ1cy4KKworICBCYXNlIGFkZHJlc3MgRTEwMTpFMDAwIGlzIHdoZXJlIHRoZSBBUk0gY2FuIGFjY2VzcyB0aGUgc2FtZSBHUElPIGNvbmZpZworICByZWdpc3RlcnMsIGJ1dCB0aGUgYWNjZXNzIHRha2VzIHBsYWNlIHRocm91Z2ggdGhlIEFSTSBwb3J0IGludGVyZmFjZSAoY2FsbGVkCisgIEFQSSBvciBNUFVJKSB2aWEgdGhlIERTUCdzIHBlcmlwaGVyYWwgYnVzIChEU1AgSS9PIHNwYWNlKS4KKworICBUaGVyZWZvcmUsIHRoZSBBUk0gc2hvdWxkIHNldHVwIHRoZSBHUElPIHJlZ3MgdGhydSB0aGUgRkZGQzpFMDAwIGFkZHJlc3NlcworICBpbnN0ZWFkIG9mIHRoZSBFMTAxOkUwMDAgYWRkcmVzc2VzLiAgVGhlIERTUCBoYXMgb25seSByZWFkIGFjY2VzcyBvZiB0aGUgcGluCisgIGNvbnRyb2wgcmVnaXN0ZXIsIHNvIHRoaXMgbWF5IGV4cGxhaW4gdGhlIGluYWJpbGl0eSB0byB3cml0ZSB0byBFMTAxOkUwMTguCisgIFRyeSBhY2Nlc3NpbmcgcGluIGNvbnRyb2wgcmVnIGF0IEZGRkM6RTAxOC4KKyAqLworI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJIDB4ZmZmY2UwMDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19TVEFSVAkgT01BUDE1MTBfR1BJT19CQVNFCisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fU0laRQkgU1pfNEsKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfQkFTRQkgMHhFMTAxMTAwMAorI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDFfU0laRQkgU1pfNEsKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AxX1NUQVJUCSAweEUxMDExMDAwCisKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AyX0JBU0UJIDB4RkZGQjEwMDAKKworI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfQkFTRQkgMHhFMTAxNzAwMAorI2RlZmluZSBPTUFQMTUxMF9NQ0JTUDNfU0laRQkgU1pfNEsKKyNkZWZpbmUgT01BUDE1MTBfTUNCU1AzX1NUQVJUCSAweEUxMDE3MDAwCisKKy8qCisgKiBXaGVyZSdzIHRoZSBmbHVzaCBhZGRyZXNzIChmb3IgZmx1c2hpbmcgRCBhbmQgSSBjYWNoZT8pCisgKi8KKyNkZWZpbmUgRkxVU0hfQkFTRQkJMHhkZjAwMDAwMAorI2RlZmluZSBGTFVTSF9CQVNFX1BIWVMgMHgwMDAwMDAwMAorCisjaWZuZGVmIF9fQVNTRU1CTEVSX18KKworI2RlZmluZSBQQ0lPX0JBU0UJCTAKKworLyoKKyAqIFJBTSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIE1BUFRPUEhZUyhhKQkJKCh1bnNpZ25lZCBsb25nKShhKSAtIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBLRVJOVE9QSFlTKGEpCQkoKHVuc2lnbmVkIGxvbmcpKCZhKSkKKyNkZWZpbmUgS0VSTkVMX0JBU0UJCSgweDEwMDA4MDAwKQorI2VuZGlmCisKKy8qIG1hY3JvIHRvIGdldCBhdCBJTyBzcGFjZSB3aGVuIHJ1bm5pbmcgdmlydHVhbGx5ICovCisjZGVmaW5lIElPX0FERFJFU1MoeCkgKCh4KSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE9NQVAxNTEwIHN5c3RlbSByZWdpc3RlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIE9NQVAxNTEwX1VBUlQxX0JBU0UJICAgIDB4ZmZmYjAwMDAJIC8qICJCTFVFVE9PVEgtVUFSVCIgKi8KKyNkZWZpbmUgT01BUDE1MTBfVUFSVDJfQkFTRQkgICAgMHhmZmZiMDgwMAkgLyogIk1PREVNLVVBUlQiICovCisjZGVmaW5lIE9NQVAxNTEwX1JUQ19CQVNFCSAgICAweGZmZmI0ODAwCSAvKiBSVEMgKi8KKyNkZWZpbmUgT01BUDE1MTBfVUFSVDNfQkFTRQkgICAgMHhmZmZiOTgwMAkgLyogU2hhcmVkIE1QVS9EU1AgVUFSVCAqLworI2RlZmluZSBPTUFQMTUxMF9DT01fTUNCU1AyX0JBU0UgICAgMHhmZmZmMTAwMAkgLyogQ29tIE1jQlNQMiAqLworI2RlZmluZSBPTUFQMTUxMF9BVURJT19NQ0JTUF9CQVNFICAgMHhmZmZmMTgwMAkgLyogQXVkaW8gTWNCU1AyICovCisjZGVmaW5lIE9NQVAxNTEwX0FSTUlPX0JBU0UJICAgIDB4ZmZmYjUwMDAJIC8qIGtleWJvYXJkL2dwaW8gKi8KKworLyoKKyAqIE9NQVAxNTEwIFVBUlQzIFJlZ2lzdGVycworICovCisKKyNkZWZpbmUgT01BUF9NUFVfVUFSVDNfQkFTRSAgMHhGRkZCOTgwMCAvKiBVQVJUMyB0aHJvdWdoIE1QVSBidXMgKi8KKworLyogVUFSVDMgUmVnaXN0ZXJzIE1hcGluZyB0aHJvdWdoIE1QVSBidXMgKi8KKworI2RlZmluZSBVQVJUM19SSFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMCkKKyNkZWZpbmUgVUFSVDNfVEhSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDApCisjZGVmaW5lIFVBUlQzX0RMTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAwKQorI2RlZmluZSBVQVJUM19JRVIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgNCkKKyNkZWZpbmUgVUFSVDNfRExICSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDQpCisjZGVmaW5lIFVBUlQzX0lJUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyA4KQorI2RlZmluZSBVQVJUM19GQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgOCkKKyNkZWZpbmUgVUFSVDNfRUZSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDgpCisjZGVmaW5lIFVBUlQzX0xDUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDBDKQorI2RlZmluZSBVQVJUM19NQ1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxMCkKKyNkZWZpbmUgVUFSVDNfWE9OMV9BRERSMSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTApCisjZGVmaW5lIFVBUlQzX1hPTjJfQUREUjIgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE0KQorI2RlZmluZSBVQVJUM19MU1IJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxNCkKKyNkZWZpbmUgVUFSVDNfVENSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MTgpCisjZGVmaW5lIFVBUlQzX01TUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUM19YT0ZGMQkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDE4KQorI2RlZmluZSBVQVJUM19YT0ZGMgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDFDKQorI2RlZmluZSBVQVJUM19TUFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgxQykKKyNkZWZpbmUgVUFSVDNfVExSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MUMpCisjZGVmaW5lIFVBUlQzX01EUjEJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyMCkKKyNkZWZpbmUgVUFSVDNfTURSMgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI0KQorI2RlZmluZSBVQVJUM19TRkxTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI4KQorI2RlZmluZSBVQVJUM19UWEZMTAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDI4KQorI2RlZmluZSBVQVJUM19SRVNVTUUJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyQykKKyNkZWZpbmUgVUFSVDNfVFhGTEgJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgyQykKKyNkZWZpbmUgVUFSVDNfU0ZSRUdMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzApCisjZGVmaW5lIFVBUlQzX1JYRkxMCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4MzApCisjZGVmaW5lIFVBUlQzX1NGUkVHSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM0KQorI2RlZmluZSBVQVJUM19SWEZMSAkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDM0KQorI2RlZmluZSBVQVJUM19CTFIJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzOCkKKyNkZWZpbmUgVUFSVDNfQUNSRUcJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzQykKKyNkZWZpbmUgVUFSVDNfRElWMTYJIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHgzQykKKyNkZWZpbmUgVUFSVDNfU0NSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDApCisjZGVmaW5lIFVBUlQzX1NTUgkgKE9NQVBfTVBVX1VBUlQzX0JBU0UgKyAweDQ0KQorI2RlZmluZSBVQVJUM19FQkxSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NDgpCisjZGVmaW5lIFVBUlQzX09TQ18xMk1fU0VMIChPTUFQX01QVV9VQVJUM19CQVNFICsgMHg0QykKKyNkZWZpbmUgVUFSVDNfTVZSCSAoT01BUF9NUFVfVUFSVDNfQkFTRSArIDB4NTApCisKKy8qCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVycworICovCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfMAkJMHhmZmZlMTAwMAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzEJCTB4ZmZmZTEwMDQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF8yCQkweGZmZmUxMDA4CisjZGVmaW5lIENPTVBfTU9ERV9DVFJMXzAJMHhmZmZlMTAwYworI2RlZmluZSBGVU5DX01VWF9DVFJMXzMJCTB4ZmZmZTEwMTAKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF80CQkweGZmZmUxMDE0CisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfNQkJMHhmZmZlMTAxOAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzYJCTB4ZmZmZTEwMUMKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF83CQkweGZmZmUxMDIwCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfOAkJMHhmZmZlMTAyNAorI2RlZmluZSBGVU5DX01VWF9DVFJMXzkJCTB4ZmZmZTEwMjgKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9BCQkweGZmZmUxMDJDCisjZGVmaW5lIEZVTkNfTVVYX0NUUkxfQgkJMHhmZmZlMTAzMAorI2RlZmluZSBGVU5DX01VWF9DVFJMX0MJCTB4ZmZmZTEwMzQKKyNkZWZpbmUgRlVOQ19NVVhfQ1RSTF9ECQkweGZmZmUxMDM4CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMAkJMHhmZmZlMTA0MAorI2RlZmluZSBQVUxMX0RXTl9DVFJMXzEJCTB4ZmZmZTEwNDQKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF8yCQkweGZmZmUxMDQ4CisjZGVmaW5lIFBVTExfRFdOX0NUUkxfMwkJMHhmZmZlMTA0YworI2RlZmluZSBHQVRFX0lOSF9DVFJMXzAJCTB4ZmZmZTEwNTAKKyNkZWZpbmUgVk9MVEFHRV9DVFJMXzAJCTB4ZmZmZTEwNjAKKyNkZWZpbmUgVEVTVF9EQkdfQ1RSTF8wCQkweGZmZmUxMDcwCisKKyNkZWZpbmUgTU9EX0NPTkZfQ1RSTF8wCQkweGZmZmUxMDgwCisKKy8qIDE2MTAgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworI2lmIGRlZmluZWQoQ09ORklHX09NQVAxNjEwKSB8fCBkZWZpbmVkKENPTkZJR19PTUFQMTcxMCkKKyNkZWZpbmUgVVNCX09UR19DVFJMCQkweEZGRkIwNDBDCisjZGVmaW5lIFVTQl9UUkFOU0NFSVZFUl9DVFJMCTB4RkZGRTEwNjQKKyNkZWZpbmUgUFVMTF9EV05fQ1RSTF80CQkweEZGRkUxMEFDCisjZGVmaW5lIFBVX1BEX1NFTF8wCQkweEZGRkUxMEI0CisjZGVmaW5lIFBVX1BEX1NFTF8xCQkweEZGRkUxMEI4CisjZGVmaW5lIFBVX1BEX1NFTF8yCQkweEZGRkUxMEJDCisjZGVmaW5lIFBVX1BEX1NFTF8zCQkweEZGRkUxMEMwCisjZGVmaW5lIFBVX1BEX1NFTF80CQkweEZGRkUxMEM0CisKKyNlbmRpZgorLyoKKyAqIFRyYWZmaWMgQ29udHJvbGxlciBNZW1vcnkgSW50ZXJmYWNlIFJlZ2lzdGVycworICovCisjZGVmaW5lIFRDTUlGX0JBU0UJCTB4ZmZmZWNjMDAKKyNkZWZpbmUgSU1JRl9QUklPCQkoVENNSUZfQkFTRSArIDB4MDApCisjZGVmaW5lIEVNSUZTX1BSSU9fUkVHCQkoVENNSUZfQkFTRSArIDB4MDQpCisjZGVmaW5lIEVNSUZGX1BSSU9fUkVHCQkoVENNSUZfQkFTRSArIDB4MDgpCisjZGVmaW5lIEVNSUZTX0NPTkZJR19SRUcJKFRDTUlGX0JBU0UgKyAweDBjKQorI2RlZmluZSBFTUlGU19DUzBfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxMCkKKyNkZWZpbmUgRU1JRlNfQ1MxX0NPTkZJRwkoVENNSUZfQkFTRSArIDB4MTQpCisjZGVmaW5lIEVNSUZTX0NTMl9DT05GSUcJKFRDTUlGX0JBU0UgKyAweDE4KQorI2RlZmluZSBFTUlGU19DUzNfQ09ORklHCShUQ01JRl9CQVNFICsgMHgxYykKKyNkZWZpbmUgRU1JRkZfU0RSQU1fQ09ORklHCShUQ01JRl9CQVNFICsgMHgyMCkKKyNkZWZpbmUgRU1JRkZfTVJTCQkoVENNSUZfQkFTRSArIDB4MjQpCisjZGVmaW5lIFRDX1RJTUVPVVQxCQkoVENNSUZfQkFTRSArIDB4MjgpCisjZGVmaW5lIFRDX1RJTUVPVVQyCQkoVENNSUZfQkFTRSArIDB4MmMpCisjZGVmaW5lIFRDX1RJTUVPVVQzCQkoVENNSUZfQkFTRSArIDB4MzApCisjZGVmaW5lIFRDX0VORElBTklTTQkJKFRDTUlGX0JBU0UgKyAweDM0KQorI2RlZmluZSBFTUlGRl9TRFJBTV9DT05GSUdfMgkoVENNSUZfQkFTRSArIDB4M2MpCisjZGVmaW5lIEVNSUZfQ0ZHX0RZTkFNSUNfV1MJKFRDTUlGX0JBU0UgKyAweDQwKQorCisvKgorICogTENEIFBhbmVsCisgKi8KKyNkZWZpbmUgVEk5MjVfTENEX0JBU0UJCTB4RkZGRUMwMDAKKyNkZWZpbmUgVEk5MjVfTENEX0NPTlRST0wJKFRJOTI1X0xDRF9CQVNFKQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMAkoVEk5MjVfTENEX0JBU0UrMHg0KQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMQkoVEk5MjVfTENEX0JBU0UrMHg4KQorI2RlZmluZSBUSTkyNV9MQ0RfVElNSU5HMgkoVEk5MjVfTENEX0JBU0UrMHhjKQorI2RlZmluZSBUSTkyNV9MQ0RfU1RBVFVTCShUSTkyNV9MQ0RfQkFTRSsweDEwKQorI2RlZmluZSBUSTkyNV9MQ0RfU1VCUEFORUwJKFRJOTI1X0xDRF9CQVNFKzB4MTQpCisKKyNkZWZpbmUgT01BUF9MQ0RfQ09OVFJPTAlUSTkyNV9MQ0RfQ09OVFJPTAorCisvKgorICogTU1DL1NEIEhvc3QgQ29udHJvbGxlciBSZWdpc3RlcnMKKyAqLworCisjZGVmaW5lIE9NQVBfTU1DX0NNRAkgMHhGRkZCNzgwMCAvKiBNTUMgQ29tbWFuZCAqLworI2RlZmluZSBPTUFQX01NQ19BUkdMCSAweEZGRkI3ODA0IC8qIE1NQyBhcmd1bWVudCBsb3cgKi8KKyNkZWZpbmUgT01BUF9NTUNfQVJHSAkgMHhGRkZCNzgwOCAvKiBNTUMgYXJndW1lbnQgaGlnaCAqLworI2RlZmluZSBPTUFQX01NQ19DT04JIDB4RkZGQjc4MEMgLyogTU1DIHN5c3RlbSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1NUQVQJIDB4RkZGQjc4MTAgLyogTU1DIHN0YXR1cyAqLworI2RlZmluZSBPTUFQX01NQ19JRQkgMHhGRkZCNzgxNCAvKiBNTUMgc3lzdGVtIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ1RPCSAweEZGRkI3ODE4IC8qIE1NQyBjb21tYW5kIHRpbWUtb3V0ICovCisjZGVmaW5lIE9NQVBfTU1DX0RUTwkgMHhGRkZCNzgxQyAvKiBNTUMgZGF0YSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19EQVRBCSAweEZGRkI3ODIwIC8qIE1NQyBUWC9SWCBGSUZPIGRhdGEgKi8KKyNkZWZpbmUgT01BUF9NTUNfQkxFTgkgMHhGRkZCNzgyNCAvKiBNTUMgYmxvY2sgbGVuZ3RoICovCisjZGVmaW5lIE9NQVBfTU1DX05CTEsJIDB4RkZGQjc4MjggLyogTU1DIG51bWJlciBvZiBibG9ja3MgKi8KKyNkZWZpbmUgT01BUF9NTUNfQlVGCSAweEZGRkI3ODJDIC8qIE1NQyBidWZmZXIgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPTUFQX01NQ19TUEkJIDB4RkZGQjc4MzAgLyogTU1DIHNlcmlhbCBwb3J0IGludGVyZmFjZSAqLworI2RlZmluZSBPTUFQX01NQ19TRElPCSAweEZGRkI3ODM0IC8qIE1NQyBTRElPIG1vZGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBPTUFQX01NQ19TWVNUCSAweEZGRkI3ODM4IC8qIE1NQyBzeXN0ZW0gdGVzdCAqLworI2RlZmluZSBPTUFQX01NQ19SRVYJIDB4RkZGQjc4M0MgLyogTU1DIG1vZHVsZSB2ZXJzaW9uICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDAJIDB4RkZGQjc4NDAgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMCAqLworI2RlZmluZSBPTUFQX01NQ19SU1AxCSAweEZGRkI3ODQ0IC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDEgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQMgkgMHhGRkZCNzg0OCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSAyICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDMJIDB4RkZGQjc4NEMgLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgMyAqLworI2RlZmluZSBPTUFQX01NQ19SU1A0CSAweEZGRkI3ODUwIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDQgKi8KKyNkZWZpbmUgT01BUF9NTUNfUlNQNQkgMHhGRkZCNzg1NCAvKiBNTUMgY29tbWFuZCByZXNwb25zZSA1ICovCisjZGVmaW5lIE9NQVBfTU1DX1JTUDYJIDB4RkZGQjc4NTggLyogTU1DIGNvbW1hbmQgcmVzcG9uc2UgNiAqLworI2RlZmluZSBPTUFQX01NQ19SU1A3CSAweEZGRkI3ODVDIC8qIE1NQyBjb21tYW5kIHJlc3BvbnNlIDQgKi8KKworLyogTU1DIG1hc2tzICovCisKKyNkZWZpbmUgT01BUF9NTUNfRU5EX09GX0NNRAkoMSA8PCAwKQkvKiBFbmQgb2YgY29tbWFuZCBwaGFzZSAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0JVU1kJKDEgPDwgMikJLyogQ2FyZCBlbnRlciBidXN5IHN0YXRlICovCisjZGVmaW5lIE9NQVBfTU1DX0JMT0NLX1JTCSgxIDw8IDMpCS8qIEJsb2NrIHJlY2VpdmVkL3NlbnQgKi8KKyNkZWZpbmUgT01BUF9NTUNfRU9GX0JVU1kJKDEgPDwgNCkJLyogQ2FyZCBleGl0IGJ1c3kgc3RhdGUgKi8KKyNkZWZpbmUgT01BUF9NTUNfREFUQV9USU1FT1VUCSgxIDw8IDUpCS8qIERhdGEgcmVzcG9uc2UgdGltZS1vdXQgKi8KKyNkZWZpbmUgT01BUF9NTUNfREFUQV9DUkMJKDEgPDwgNikJLyogRGF0ZSBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ01EX1RJTUVPVVQJKDEgPDwgNykJLyogQ29tbWFuZCByZXNwb25zZSB0aW1lLW91dCAqLworI2RlZmluZSBPTUFQX01NQ19DTURfQ1JDCSgxIDw8IDgpCS8qIENvbW1hbmQgQ1JDIGVycm9yICovCisjZGVmaW5lIE9NQVBfTU1DX0FfRlVMTAkJKDEgPDwgMTApCS8qIEJ1ZmZlciBhbG1vc3QgZnVsbCAqLworI2RlZmluZSBPTUFQX01NQ19BX0VNUFRZCSgxIDw8IDExKQkvKiBCdWZmZXIgYWxtb3N0IGVtcHR5ICovCisjZGVmaW5lIE9NQVBfTU1DX09DUl9CVVNZCSgxIDw8IDEyKQkvKiBPQ1IgYnVzeSAqLworI2RlZmluZSBPTUFQX01NQ19DQVJEX0lSUQkoMSA8PCAxMykJLyogQ2FyZCBJUlEgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgT01BUF9NTUNfQ0FSRF9FUlIJKDEgPDwgMTQpCS8qIENhcmQgc3RhdHVzIGVycm9yIGluIHJlc3BvbnNlICovCisKKy8qIDIuOS4yIE1QVUkgSW50ZXJmYWNlIFJlZ2lzdGVycyBGRkZFOkM5MDAgKi8KKworI2RlZmluZSBNUFVJX0NUUkxfUkVHCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwMCkKKyNkZWZpbmUgTVBVSV9ERUJVR19BRERSCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwNCkKKyNkZWZpbmUgTVBVSV9ERUJVR19EQVRBCQkodm9sYXRpbGUgX191MzIgKikoMHhmZmZlYzkwOCkKKyNkZWZpbmUgTVBVSV9ERUJVR19GTEFHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkwYykKKyNkZWZpbmUgTVBVSV9TVEFUVVNfUkVHCQkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxMCkKKyNkZWZpbmUgTVBVSV9EU1BfU1RBVFVTX1JFRwkodm9sYXRpbGUgX191MTYgKikoMHhmZmZlYzkxNCkKKyNkZWZpbmUgTVBVSV9EU1BfQk9PVF9DT05GSUcJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MTgpCisjZGVmaW5lIE1QVUlfRFNQX0FQSV9DT05GSUcJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWM5MWMpCisKKy8qIDIuOS42IFRyYWZmaWMgQ29udHJvbGxlciBNZW1vcnkgSW50ZXJmYWNlIFJlZ2lzdGVyczogKi8KKyNkZWZpbmUgT01BUF9JTUlGX1BSSU9fUkVHCQkweGZmZmVjYzAwCisjZGVmaW5lIE9NQVBfRU1JRlNfUFJJT19SRUcJCTB4ZmZmZWNjMDQKKyNkZWZpbmUgT01BUF9FTUlGRl9QUklPX1JFRwkJMHhmZmZlY2MwOAorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19SRUcJCTB4ZmZmZWNjMGMKKyNkZWZpbmUgT01BUF9FTUlGU19DUzBfQ09ORklHCQkweGZmZmVjYzEwCisjZGVmaW5lIE9NQVBfRU1JRlNfQ1MxX0NPTkZJRwkJMHhmZmZlY2MxNAorI2RlZmluZSBPTUFQX0VNSUZTX0NTMl9DT05GSUcJCTB4ZmZmZWNjMTgKKyNkZWZpbmUgT01BUF9FTUlGU19DUzNfQ09ORklHCQkweGZmZmVjYzFjCisjZGVmaW5lIE9NQVBfRU1JRkZfU0RSQU1fQ09ORklHCQkweGZmZmVjYzIwCisjZGVmaW5lIE9NQVBfRU1JRkZfTVJTCQkJMHhmZmZlY2MyNAorI2RlZmluZSBPTUFQX1RJTUVPVVQxCQkJMHhmZmZlY2MyOAorI2RlZmluZSBPTUFQX1RJTUVPVVQyCQkJMHhmZmZlY2MyYworI2RlZmluZSBPTUFQX1RJTUVPVVQzCQkJMHhmZmZlY2MzMAorI2RlZmluZSBPTUFQX0VORElBTklTTQkJCTB4ZmZmZWNjMzQKKworLyogMi45LjEwIEVNSUYgU2xvdyBJbnRlcmZhY2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoRU1JRlNfQ09ORklHX1JFRyk6ICovCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX0ZSCQkoMSA8PCA0KQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19QREUJCSgxIDw8IDMpCisjZGVmaW5lIE9NQVBfRU1JRlNfQ09ORklHX1BXRF9FTgkoMSA8PCAyKQorI2RlZmluZSBPTUFQX0VNSUZTX0NPTkZJR19CTQkJKDEgPDwgMSkKKyNkZWZpbmUgT01BUF9FTUlGU19DT05GSUdfV1AJCSgxIDw8IDApCisKKy8qCisgKiBNZW1vcnkgY2h1bmsgc2V0IGFzaWRlIGZvciB0aGUgRnJhbWVidWZmZXIgaW4gU1JBTQorICovCisjZGVmaW5lIFNSQU1fRlJBTUVCVUZGRVJfTUVNT1JZIE9NQVAxNTEwX1NSQU1fQkFTRQorCisKKy8qCisgKiBETUEKKyAqLworCisjZGVmaW5lIE9NQVAxNTEwX0RNQV9CQVNFIDB4RkZGRUQ4MDAKKyNkZWZpbmUgT01BUF9ETUFfQkFTRQkgIE9NQVAxNTEwX0RNQV9CQVNFCisKKy8qIEdsb2JhbCBSZWdpc3RlciBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTk9fR0xPQkFMX0RNQV9BQ0NFU1MgMAorCisvKiBDaGFubmVsIHNlbGVjdCBmaWVsZAorICogTk9URTogYWxsIG90aGVyIGNoYW5uZWxzIGFyZSBsaW5lYXIsIGNoYW4wIGlzIDAsIGNoYW4xIGlzIDEsIGV0Yy4uLgorICovCisjZGVmaW5lIExDRF9DSEFOTkVMIDB4YworCisvKiBSZWdpc3RlciBTZWxlY3QgRmllbGQgKExDRCkgKi8KKyNkZWZpbmUgRE1BX0xDRF9DVFJMCQkwCisjZGVmaW5lIERNQV9MQ0RfVE9QX0YxX0wJMQorI2RlZmluZSBETUFfTENEX1RPUF9GMV9VCTIKKyNkZWZpbmUgRE1BX0xDRF9CT1RfRjFfTAkzCisjZGVmaW5lIERNQV9MQ0RfQk9UX0YxX1UJNAorCisjZGVmaW5lIExDRF9GUkFNRV9NT0RFCQkoMTw8MCkKKyNkZWZpbmUgTENEX0ZSQU1FX0lUX0lFCQkoMTw8MSkKKyNkZWZpbmUgTENEX0JVU19FUlJPUl9JVF9JRQkoMTw8MikKKyNkZWZpbmUgTENEX0ZSQU1FXzFfSVRfQ09ORAkoMTw8MykKKyNkZWZpbmUgTENEX0ZSQU1FXzJfSVRfQ09ORAkoMTw8NCkKKyNkZWZpbmUgTENEX0JVU19FUlJPUl9JVF9DT05ECSgxPDw1KQorI2RlZmluZSBMQ0RfU09VUkNFX0lNSUYJCSgxPDw2KQorCisvKgorICogUmVhbC1UaW1lIENsb2NrCisgKi8KKworI2RlZmluZSBSVENfU0VDT05EUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDAwKQorI2RlZmluZSBSVENfTUlOVVRFUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDA0KQorI2RlZmluZSBSVENfSE9VUlMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwOCkKKyNkZWZpbmUgUlRDX0RBWVMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgwQykKKyNkZWZpbmUgUlRDX01PTlRIUwkJKHZvbGF0aWxlIF9fdTggKikoT01BUDE1MTBfUlRDX0JBU0UgKyAweDEwKQorI2RlZmluZSBSVENfWUVBUlMJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgUlRDX0NUUkwJCSh2b2xhdGlsZSBfX3U4ICopKE9NQVAxNTEwX1JUQ19CQVNFICsgMHg0MCkKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBJbnRlcnJ1cHQgSGFuZGxlcnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqLworI2RlZmluZSBPTUFQX0lIMV9CQVNFCQkweGZmZmVjYjAwCisjZGVmaW5lIE9NQVBfSUgyX0JBU0UJCTB4ZmZmZTAwMDAKKyNkZWZpbmUgT01BUDE1MTBfSVRSCQkweDAKKyNkZWZpbmUgT01BUDE1MTBfTUFTSwkJMHg0CisKKyNkZWZpbmUgSU5URVJSVVBUX0hBTkRMRVJfQkFTRQkgT01BUF9JSDFfQkFTRQorI2RlZmluZSBJTlRFUlJVUFRfSU5QVVRfUkVHSVNURVIgT01BUDE1MTBfSVRSCisjZGVmaW5lIElOVEVSUlVQVF9NQVNLX1JFR0lTVEVSCSBPTUFQMTUxMF9NQVNLCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgVElNRVJTCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKworI2RlZmluZSBPTUFQMTUxMF8zMmtIel9USU1FUl9CQVNFIDB4ZmZmYjkwMDAKKworLyogMzJrIFRpbWVyIFJlZ2lzdGVycyAqLworI2RlZmluZSBUSU1FUjMya19DUgkweDA4CisjZGVmaW5lIFRJTUVSMzJrX1RWUgkweDAwCisjZGVmaW5lIFRJTUVSMzJrX1RDUgkweDA0CisKKy8qIDMyayBUaW1lciBDb250cm9sIFJlZ2lzdGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgVElNRVIzMmtfVFNTCSgxPDwwKQorI2RlZmluZSBUSU1FUjMya19UUkIJKDE8PDEpCisjZGVmaW5lIFRJTUVSMzJrX0lOVAkoMTw8MikKKyNkZWZpbmUgVElNRVIzMmtfQVJMCSgxPDwzKQorCisvKiBNUFUgVGltZXIgYmFzZSBhZGRyZXNzZXMgICovCisjZGVmaW5lIE9NQVAxNTEwX01QVVRJTUVSX0JBU0UJMHhmZmZlYzUwMAorI2RlZmluZSBPTUFQMTUxMF9NUFVUSU1FUl9PRkYJMHgwMDAwMDEwMAorCisjZGVmaW5lIE9NQVAxNTEwX1RJTUVSMV9CQVNFCTB4ZmZmZWM1MDAKKyNkZWZpbmUgT01BUDE1MTBfVElNRVIyX0JBU0UJMHhmZmZlYzYwMAorI2RlZmluZSBPTUFQMTUxMF9USU1FUjNfQkFTRQkweGZmZmVjNzAwCisKKy8qIE1QVSBUaW1lciBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQ05UTF9USU1FUgkwCisjZGVmaW5lIExPQURfVElNCTQKKyNkZWZpbmUgUkVBRF9USU0JOAorCisvKiAgQ05UTF9USU1FUiByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIE1QVVRJTV9GUkVFCQkoMTw8NikKKyNkZWZpbmUgTVBVVElNX0NMT0NLX0VOQUJMRQkoMTw8NSkKKyNkZWZpbmUgTVBVVElNX1BUVl9NQVNLCQkoMHg3PDxQVFZfQklUKQorI2RlZmluZSBNUFVUSU1fUFRWX0JJVAkJMgorI2RlZmluZSBNUFVUSU1fQVIJCSgxPDwxKQorI2RlZmluZSBNUFVUSU1fU1QJCSgxPDwwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBHUElPIChTSEFSRUQpCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgR1BJT19EQVRBX0lOUFVUX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgwKQorI2RlZmluZSBHUElPX0RBVEFfT1VUUFVUX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHg0KQorI2RlZmluZSBHUElPX0RJUl9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHg4KQorI2RlZmluZSBHUElPX0lOVF9DT05UUk9MX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHhjKQorI2RlZmluZSBHUElPX0lOVF9NQVNLX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxMCkKKyNkZWZpbmUgR1BJT19JTlRfU1RBVFVTX1JFRwkoT01BUDE1MTBfR1BJT19CQVNFICsgMHgxNCkKKyNkZWZpbmUgR1BJT19QSU5fQ09OVFJPTF9SRUcJKE9NQVAxNTEwX0dQSU9fQkFTRSArIDB4MTgpCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPTUFQMTUxMCBNUFVJTyAoQVJNIG9ubHkpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBPTUFQMTUxMF9NUFVJT19CQVNFCTB4RkZGQjUwMDAKKyNkZWZpbmUgTVBVSU9fREFUQV9JTlBVVF9SRUcJKE9NQVAxNTEwX01QVUlPX0JBU0UgKyAweDApCisjZGVmaW5lIE1QVUlPX0RBVEFfT1VUUFVUX1JFRwkoT01BUDE1MTBfTVBVSU9fQkFTRSArIDB4NCkKKyNkZWZpbmUgTVBVSU9fRElSX0NPTlRST0xfUkVHCShPTUFQMTUxMF9NUFVJT19CQVNFICsgMHg4KQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBPTUFQMTUxMCBUSVBCIChvbmx5KQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICovCisjZGVmaW5lIFRJUEJfUFVCTElDX0NOVExfQkFTRQkJMHhmZmZlZDMwMAorI2RlZmluZSBNUFVfUFVCTElDX1RJUEJfQ05UTF9SRUcJKFRJUEJfUFVCTElDX0NOVExfQkFTRSArIDB4OCkKKyNkZWZpbmUgVElQQl9QUklWQVRFX0NOVExfQkFTRQkJMHhmZmZlY2EwMAorI2RlZmluZSBNUFVfUFJJVkFURV9USVBCX0NOVExfUkVHCShUSVBCX1BSSVZBVEVfQ05UTF9CQVNFICsgMHg4KQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgT01BUDE1MTAgQ2FtZXJhIEludGVyZmFjZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNkZWZpbmUgQ0FNRVJBX0JBU0UJCShJT19CQVNFICsgMHg2ODAwKQorI2RlZmluZSBDQU1fQ1RSTENMT0NLX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDAwKQorI2RlZmluZSBDQU1fSVRfU1RBVFVTX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDA0KQorI2RlZmluZSBDQU1fTU9ERV9SRUcJCShDQU1FUkFfQkFTRSArIDB4MDgpCisjZGVmaW5lIENBTV9TVEFUVVNfUkVHCQkoQ0FNRVJBX0JBU0UgKyAweDBDKQorI2RlZmluZSBDQU1fQ0FNREFUQV9SRUcJCShDQU1FUkFfQkFTRSArIDB4MTApCisjZGVmaW5lIENBTV9HUElPX1JFRwkJKENBTUVSQV9CQVNFICsgMHgxNCkKKyNkZWZpbmUgQ0FNX1BFQUtfQ1RSX1JFRwkoQ0FNRVJBX0JBU0UgKyAweDE4KQorCisjaWYgMAorI2lmbmRlZiBfX0FTU0VNQkxZX18KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UzMiBjdHJsY2xvY2s7CisJX191MzIgaXRfc3RhdHVzOworCV9fdTMyIG1vZGU7CisJX191MzIgc3RhdHVzOworCV9fdTMyIGNhbWRhdGE7CisJX191MzIgZ3BpbzsKKwlfX3UzMiBwZWFrX2NvdW50ZXI7Cit9IGNhbWVyYV9yZWdzX3Q7CisjZW5kaWYKKyNlbmRpZgorCisvKiBDVFJMQ0xPQ0sgYml0IHNoaWZ0cyAqLworI2RlZmluZSBGT1NDTU9EX0JJVAkwCisjZGVmaW5lIEZPU0NNT0RfTUFTSwkoMHg3IDw8IEZPU0NNT0RfQklUKQorI2RlZmluZQkgRk9TQ01PRF8xMk1IegkweDAKKyNkZWZpbmUJIEZPU0NNT0RfNk1IegkweDIKKyNkZWZpbmUJIEZPU0NNT0RfOV82TUh6IDB4NAorI2RlZmluZQkgRk9TQ01PRF8yNE1IegkweDUKKyNkZWZpbmUJIEZPU0NNT0RfOE1IegkweDYKKyNkZWZpbmUgUE9MQ0xLCQkoMTw8MykKKyNkZWZpbmUgQ0FNRVhDTEtfRU4JKDE8PDQpCisjZGVmaW5lIE1DTEtfRU4JCSgxPDw1KQorI2RlZmluZSBEUExMX0VOCQkoMTw8NikKKyNkZWZpbmUgTENMS19FTgkJKDE8PDcpCisKKy8qIElUX1NUQVRVUyBiaXQgc2hpZnRzICovCisjZGVmaW5lIFZfVVAJCSgxPDwwKQorI2RlZmluZSBWX0RPV04JCSgxPDwxKQorI2RlZmluZSBIX1VQCQkoMTw8MikKKyNkZWZpbmUgSF9ET1dOCQkoMTw8MykKKyNkZWZpbmUgRklGT19GVUxMCSgxPDw0KQorI2RlZmluZSBEQVRBX1hGRVIJKDE8PDUpCisKKy8qIE1PREUgYml0IHNoaWZ0cyAqLworI2RlZmluZSBDQU1PU0MJCSgxPDwwKQorI2RlZmluZSBJTUdTSVpFX0JJVAkxCisjZGVmaW5lIElNR1NJWkVfTUFTSwkoMHgzIDw8IElNR1NJWkVfQklUKQorI2RlZmluZQkgSU1HU0laRV9DSUYJKDB4MCA8PCBJTUdTSVpFX0JJVCkJLyogMzUyeDI4OCAqLworI2RlZmluZQkgSU1HU0laRV9RQ0lGCSgweDEgPDwgSU1HU0laRV9CSVQpCS8qIDE3NngxNDQgKi8KKyNkZWZpbmUJIElNR1NJWkVfVkdBCSgweDIgPDwgSU1HU0laRV9CSVQpCS8qIDY0MHg0ODAgKi8KKyNkZWZpbmUJIElNR1NJWkVfUVZHQQkoMHgzIDw8IElNR1NJWkVfQklUKQkvKiAzMjB4MjQwICovCisjZGVmaW5lIE9SREVSQ0FNRAkoMTw8MykKKyNkZWZpbmUgRU5fVl9VUAkJKDE8PDQpCisjZGVmaW5lIEVOX1ZfRE9XTgkoMTw8NSkKKyNkZWZpbmUgRU5fSF9VUAkJKDE8PDYpCisjZGVmaW5lIEVOX0hfRE9XTgkoMTw8NykKKyNkZWZpbmUgRU5fRE1BCQkoMTw8OCkKKyNkZWZpbmUgVEhSRVNIT0xECSgxPDw5KQorI2RlZmluZSBUSFJFU0hPTERfQklUCTkKKyNkZWZpbmUgVEhSRVNIT0xEX01BU0sJKDB4N2Y8PDkpCisjZGVmaW5lIEVOX05JUlEJCSgxPDwxNikKKyNkZWZpbmUgRU5fRklGT19GVUxMCSgxPDwxNykKKyNkZWZpbmUgUkFaX0ZJRk8JKDE8PDE4KQorCisvKiBTVEFUVVMgYml0IHNoaWZ0cyAqLworI2RlZmluZSBWU1RBVFVTCQkoMTw8MCkKKyNkZWZpbmUgSFNUQVRVUwkJKDE8PDEpCisKKy8qIEdQSU8gYml0IHNoaWZ0cyAqLworI2RlZmluZSBDQU1fUlNUCQkoMTw8MCkKKworCisvKioqKioqKioqKioqKioqKioqKioqCisgKiBXYXRjaGRvZyB0aW1lci4KKyAqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFdEVElNX0JBU0UJMHhmZmZlYzgwMAorI2RlZmluZSBXRFRJTV9DT05UUk9MCShXRFRJTV9CQVNFKzB4MDApCisjZGVmaW5lIFdEVElNX0xPQUQJKFdEVElNX0JBU0UrMHgwNCkKKyNkZWZpbmUgV0RUSU1fUkVBRAkoV0RUSU1fQkFTRSsweDA0KQorI2RlZmluZSBXRFRJTV9NT0RFCShXRFRJTV9CQVNFKzB4MDgpCisKKy8qIFZhbHVlcyB0byB3cml0ZSB0byBtb2RlIHJlZ2lzdGVyIHRvIGRpc2FibGUgdGhlIHdhdGNoZG9nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBESVNBQkxFX1NFUTEJMHhGNQorI2RlZmluZSBESVNBQkxFX1NFUTIJMHhBMAorCisvKiBXRFRJTV9DT05UUk9MIGJpdCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgV0RUSU1fQ09OVFJPTF9TVAlCSVQ3CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRGlmZmVyZW50aWF0aW5nIHByb2Nlc3NvciB2ZXJzaW9ucyBmb3IgdGhvc2Ugd2hvIGNhcmUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKi8KKyNkZWZpbmUgT01BUDE1MDkgMAorI2RlZmluZSBPTUFQMTUxMCAxCisKKyNkZWZpbmUgT01BUDE1MTBfSURfQ09ERV9SRUcgMHhmZmZlZDQwNAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworaW50IGNwdV90eXBlKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBFVk0gSW1wbGVtZW50YXRpb24gU3BlY2lmaWNzLgorICoKKyAqICoqKiBOT1RFICoqKgorICogQW55IGRlZmluaXRpb25zIGluIHRoZXNlIGZpbGVzIHNob3VsZCBiZSBwcmVmaXhlZCBieSBhbiBpZGVudGlmaWVyIC0KKyAqIGVnLiBPTUFQMTUxMFAxX0ZMQVNIMF9CQVNFIC4KKyAqCisgKi8KKyNpZmRlZiBDT05GSUdfT01BUF9JTk5PVkFUT1IKKyNpbmNsdWRlICJpbm5vdmF0b3IuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09NQVBfMTUxMFAxCisjaW5jbHVkZSAib21hcDE1MTBwMS5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDTEtHRU5fUkVTRVRfQkFTRSAoMHhmZmZlY2UwMCkKKyNkZWZpbmUgQVJNX0NLQ1RMCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MCkKKyNkZWZpbmUgQVJNX0lETEVDVDEJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHg0KQorI2RlZmluZSBBUk1fSURMRUNUMgkodm9sYXRpbGUgX191MTYgKikoQ0xLR0VOX1JFU0VUX0JBU0UgKyAweDgpCisjZGVmaW5lIEFSTV9FV1VQQ1QJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHhDKQorI2RlZmluZSBBUk1fUlNUQ1QxCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MTApCisjZGVmaW5lIEFSTV9SU1RDVDIJKHZvbGF0aWxlIF9fdTE2ICopKENMS0dFTl9SRVNFVF9CQVNFICsgMHgxNCkKKyNkZWZpbmUgQVJNX1NZU1NUCSh2b2xhdGlsZSBfX3UxNiAqKShDTEtHRU5fUkVTRVRfQkFTRSArIDB4MTgpCisKKworI2RlZmluZSBDS19DTEtJTgkxMiAvKiBNSHogKi8KKyNkZWZpbmUgQ0tfUkFURUYJMQorI2RlZmluZSBDS19JRExFRgkyCisjZGVmaW5lIENLX0VOQUJMRUYJNAorI2RlZmluZSBDS19TRUxFQ1RGCTgKKyNpZm5kZWYgX19BU1NFTUJMRVJfXworI2RlZmluZSBDS19EUExMMQkoKHZvbGF0aWxlIF9fdTE2ICopMHhmZmZlY2YwMCkKKyNlbHNlCisjZGVmaW5lIENLX0RQTEwxICgweGZmZmVjZjAwKQorI2VuZGlmCisjZGVmaW5lIFNFVEFSTV9JRExFX1NISUZUCisKKy8qIEFSTV9DS0NUTCBiaXQgc2hpZnRzICovCisjZGVmaW5lIFBFUkRJVgkJMAorI2RlZmluZSBMQ0RESVYJCTIKKyNkZWZpbmUgQVJNRElWCQk0CisjZGVmaW5lIERTUERJVgkJNgorI2RlZmluZSBUQ0RJVgkJOAorI2RlZmluZSBEU1BNTVVESVYJMTAKKyNkZWZpbmUgQVJNX1RJTVhPCTEyCisjZGVmaW5lIEVOX0RTUENLCTEzCisjZGVmaW5lIEFSTV9JTlRIQ0tfU0VMCTE0IC8qIFJFVklTSVQgLS0gd2hlcmUgaXMgdGhpcyB1c2VkPyAqLworCisjZGVmaW5lIEFSTV9DS0NUTF9SU1JWRF9CSVQxNQkJKDEgPDwgMTUpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1fSU5USENLX1NFTAkoMSA8PCAxNCkKKyNkZWZpbmUgQVJNX0NLQ1RMX0VOX0RTUENLCQkoMSA8PCAxMykKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTV9USU1YTwkJKDEgPDwgMTIpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BNTVVfRElWMQkJKDEgPDwgMTEpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BNTVVfRElWMgkJKDEgPDwgMTApCisjZGVmaW5lIEFSTV9DS0NUTF9UQ0RJVjEJCSgxIDw8IDkpCisjZGVmaW5lIEFSTV9DS0NUTF9UQ0RJVjIJCSgxIDw8IDgpCisjZGVmaW5lIEFSTV9DS0NUTF9EU1BESVYxCQkoMSA8PCA3KQorI2RlZmluZSBBUk1fQ0tDVExfRFNQRElWMAkJKDEgPDwgNikKKyNkZWZpbmUgQVJNX0NLQ1RMX0FSTURJVjEJCSgxIDw8IDUpCisjZGVmaW5lIEFSTV9DS0NUTF9BUk1ESVYwCQkoMSA8PCA0KQorI2RlZmluZSBBUk1fQ0tDVExfTENERElWMQkJKDEgPDwgMykKKyNkZWZpbmUgQVJNX0NLQ1RMX0xDRERJVjAJCSgxIDw8IDIpCisjZGVmaW5lIEFSTV9DS0NUTF9QRVJESVYxCQkoMSA8PCAxKQorI2RlZmluZSBBUk1fQ0tDVExfUEVSRElWMAkJKDEgPDwgMCkKKworLyogQVJNX0lETEVDVDEgYml0IHNoaWZ0cyAqLworI2RlZmluZSBJRExXRFRfQVJNCTAKKyNkZWZpbmUgSURMWE9SUF9BUk0JMQorI2RlZmluZSBJRExQRVJfQVJNCTIKKyNkZWZpbmUgSURMTENEX0FSTQkzCisjZGVmaW5lIElETExCX0FSTQk0CisjZGVmaW5lIElETEhTQUJfQVJNCTUKKyNkZWZpbmUgSURMSUZfQVJNCTYKKyNkZWZpbmUgSURMRFBMTF9BUk0JNworI2RlZmluZSBJRExBUElfQVJNCTgKKyNkZWZpbmUgSURMVElNX0FSTQk5CisjZGVmaW5lIFNFVEFSTV9JRExFCTExCisKKy8qIEFSTV9JRExFQ1QyIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fV0RUQ0sJMAorI2RlZmluZSBFTl9YT1JQQ0sJMQorI2RlZmluZSBFTl9QRVJDSwkyCisjZGVmaW5lIEVOX0xDRENLCTMKKyNkZWZpbmUgRU5fTEJDSwkJNAorI2RlZmluZSBFTl9IU0FCQ0sJNQorI2RlZmluZSBFTl9BUElDSwk2CisjZGVmaW5lIEVOX1RJTUNLCTcKKyNkZWZpbmUgRE1BQ0tfUkVRCTgKKyNkZWZpbmUgRU5fR1BJT0NLCTkKKyNkZWZpbmUgRU5fTEJGUkVFQ0sJMTAKKworI2RlZmluZSBBUk1fUlNUQ1QxX1NXX1JTVAkoMSA8PCAzKQorI2RlZmluZSBBUk1fUlNUQ1QxX0RTUF9SU1QJKDEgPDwgMikKKyNkZWZpbmUgQVJNX1JTVENUMV9EU1BfRU4JKDEgPDwgMSkKKyNkZWZpbmUgQVJNX1JTVENUMV9BUk1fUlNUCSgxIDw8IDApCisKKy8qIEFSTV9SU1RDVDIgYml0IHNoaWZ0cyAqLworI2RlZmluZSBFTl9QRVIJCTAKKworI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUMTUJKDEgPDwgMTUpCisjZGVmaW5lIEFSTV9TWVNTVF9SU1JWRF9CSVQxNAkoMSA8PCAxNCkKKyNkZWZpbmUgQVJNX1NZU1NUX0NMT0NLX1NFTEVDVDIgKDEgPDwgMTMpCisjZGVmaW5lIEFSTV9TWVNTVF9DTE9DS19TRUxFQ1QxICgxIDw8IDEyKQorI2RlZmluZSBBUk1fU1lTU1RfQ0xPQ0tfU0VMRUNUMCAoMSA8PCAxMSkKKyNkZWZpbmUgQVJNX1NZU1NUX1JTUlZEX0JJVDEwCSgxIDw8IDEwKQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUOQkoMSA8PCA5KQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUOAkoMSA8PCA4KQorI2RlZmluZSBBUk1fU1lTU1RfUlNSVkRfQklUNwkoMSA8PCA3KQorI2RlZmluZSBBUk1fU1lTU1RfSURMRV9EU1AJKDEgPDwgNikKKyNkZWZpbmUgQVJNX1NZU1NUX1BPUgkJKDEgPDwgNSkKKyNkZWZpbmUgQVJNX1NZU1NUX0VYVF9SU1QJKDEgPDwgNCkKKyNkZWZpbmUgQVJNX1NZU1NUX0FSTV9NQ1JTVAkoMSA8PCAzKQorI2RlZmluZSBBUk1fU1lTU1RfQVJNX1dEUlNUCSgxIDw8IDIpCisjZGVmaW5lIEFSTV9TWVNTVF9HTE9CX1NXUlNUCSgxIDw8IDEpCisjZGVmaW5lIEFSTV9TWVNTVF9EU1BfV0RSU1QJKDEgPDwgMCkKKworLyogVGFibGUgMTUtMjMuIERQTEwgQ29udHJvbCBSZWdpc3RlcnM6ICovCisjZGVmaW5lIERQTExfQ1RMX1JFRwkJKHZvbGF0aWxlIF9fdTE2ICopKDB4ZmZmZWNmMDApCisKKy8qIFRhYmxlIDE1LTI0LiBDb250cm9sIFJlZ2lzdGVyIChDVExfUkVHKTogKi8KKworI2RlZmluZSBEUExMX0NUTF9SRUdfSU9CCQkoMSA8PCAxMykKKyNkZWZpbmUgRFBMTF9DVExfUkVHX1BMTF9NVUxUCQlGbGQoNSwwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE9NQVAgSU5URVJSVVBUIFJFR0lTVEVSUyAqLworI2RlZmluZSBJUlFfSVRSCQkJMHgwMAorI2RlZmluZSBJUlFfTUlSCQkJMHgwNAorI2RlZmluZSBJUlFfU0lSX0lSUQkJMHgxMAorI2RlZmluZSBJUlFfU0lSX0ZJUQkJMHgxNAorI2RlZmluZSBJUlFfQ09OVFJPTF9SRUcJCTB4MTgKKyNkZWZpbmUgSVJRX0lTUgkJCTB4OWMKKyNkZWZpbmUgSVJRX0lMUjAJCTB4MWMKKworI2RlZmluZSBSRUdfSUhMMV9NSVIgIChPTUFQX0lIMV9CQVNFK0lSUV9NSVIpCisjZGVmaW5lIFJFR19JSEwyX01JUiAgKE9NQVBfSUgyX0JBU0UrSVJRX01JUikKKworLyogSU5URVJSVVBUIExFVkVMIFJFR0lTVEVSIEJJVFMgKi8KKyNkZWZpbmUgSUxSX1BSSU9SSVRZX01BU0sJKDB4M2MpCisjZGVmaW5lIElMUl9QUklPUklUWV9TSElGVAkoMikKKyNkZWZpbmUgSUxSX0xFVkVMX1RSSUdHRVIJKDE8PDEpCisjZGVmaW5lIElMUl9GSVEJCQkoMTw8MCkKKworI2RlZmluZSBJUlFfTEVWRUxfSU5UCQkxCisjZGVmaW5lIElSUV9FREdFX0lOVAkJMApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAxNzEwaDMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMTcxMGgzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQKKyAqIFRleGFzIEluc3RydW1lbnRzLgorICogSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4sIEtzaGl0aWogR3VwdGEgPGtzaGl0aWpAdGkuY29tPgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBIMyBib2FyZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmIF9fQ09ORklHX0gKKyNkZWZpbmUgX19DT05GSUdfSAorCisvKiBleGFjdGx5IHVuY29tbWVudCBvbmUgKi8KKyNkZWZpbmUgQ0ZHX0JPT1RfQ1MwCSAgLyogUk9NIGNvZGUgLT4gc2lnbmVkIFgtTG9hZGVyIGluIE5OQUQgKi8KKy8vI2RlZmluZSBDRkdfQk9PVF9DUzMJICAvKiB1bnNpZ25lZCBYLWxvYWRlciBpbiBOT1IgZm9yIGRldmVsb3BtZW50ICovCisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqIChlYXN5IHRvIGNoYW5nZSkKKyAqLworI2RlZmluZSBDT05GSUdfQVJNOTI2RUpTCTEJLyogVGhpcyBpcyBhbiBhcm05MjZlanMgQ1BVIGNvcmUgICovCisjZGVmaW5lIENPTkZJR19PTUFQCTEJCQkvKiBpbiBhIFRJIE9NQVAgY29yZSAgICAqLworI2RlZmluZSBDT05GSUdfT01BUDE3MTAJMQkJLyogd2hpY2ggaXMgaW4gYSAxNzEwICAqLworI2RlZmluZSBDT05GSUdfSDNfT01BUDE3MTAJMQkvKiAgYSBIMyBCb2FyZCAgKi8KKworLyogaW5wdXQgY2xvY2sgb2YgUExMICovCisvKiB0aGUgT01BUDE3MTAgSDMgaGFzIDEyTUh6IGlucHV0IGNsb2NrICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEJMTIwMDAwMDAKKworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEJMHhmZmZiMDAwMAkvKiB1YXJ0MSwgYmx1ZXRvb3RoIHVhcnQgb24gaGVsZW4gKi8KKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWAkxCisjZGVmaW5lIENPTkZJR19CQVVEUkFURQkxMTUyMDAKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworI2luY2x1ZGUgPGNvbmZpZ3Mvb21hcDE1MTAuaD4KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfUEJTSVpFCTI1NgorI2RlZmluZSBDRkdfTE9BREFERFIgCTB4MTEwMDAwMDAKKyAgCisjdW5kZWYJQ0ZHX0NMS1NfSU5fSFoJCS8qIGV2ZXJ5dGhpbmcsIGluY2wgYm9hcmQgaW5mbywgaW4gSHogKi8KKyAKKy8qIFRoZSAxNzEwIGhhcyA2IHRpbWVycywgdGhleSBjYW4gYmUgZHJpdmVuIGJ5IHRoZSBSZWZDbGsgKDEyTWh6KSBvciBieQorICogRFBMTDEuIFRoaXMgdGltZSBpcyBmdXJ0aGVyIHN1YmRpdmlkZWQgYnkgYSBsb2NhbCBkaXZpc29yLgorICovCisjZGVmaW5lIENGR19USU1FUkJBU0UJMHhGRkZFQzUwMAkvKiB1c2UgdGltZXIgMSAqLworI2RlZmluZSBDRkdfUFZUCTcJLyogMl4ocHZ0KzEpLCBkaXZpZGUgYnkgMjU2ICovCisjZGVmaW5lIENGR19IWgkoKENPTkZJR19TWVNfQ0xLX0ZSRVEpLygyIDw8IENGR19QVlQpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19OQU5EX0s5RjU2MTYgICAgLyogU2Ftc3VuZyAxNi1iaXQgMzJNQiBjaGlwICovCisKKyNpZmRlZiBDRkdfQk9PVF9DUzAKKyNkZWZpbmUgTkFORF9BRERSIDB4MGMwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MzKi8KKyNlbHNlCisjZGVmaW5lIE5BTkRfQUREUiAweDBhMDAwMDAwICAvKiBwaHlzaWNhbCBhZGRyZXNzIHRvIGFjY2VzcyBuYW5kIGF0IENTMkIqLworI2VuZGlmCisKKy8qIEgzIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAgLSAweDAwMTAwMDAgCUJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAxMDAwMCAtIDB4MDA1MDAwMCAJVS1Cb290IEltYWdlCisgKiAweDAwNTAwMDAgLSAweDAwODAwMDAgCVUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDgwMDAwIC0gMHgyMDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwMTAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA1MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgZG97ICoodm9sYXRpbGUgX191OCAqKSgodW5zaWduZWQgbG9uZylhZHIgKyAyKSA9IChfX3U4KShkKTsgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3U4ICopKCh1bnNpZ25lZCBsb25nKWFkciArIDQpID0gKF9fdTgpKGQpOyB9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkb3sgKih2b2xhdGlsZSBfX3UxNiAqKSgodW5zaWduZWQgbG9uZylhZHIpID0gKF9fdTE2KShkKTsgfSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSAoKHZvbGF0aWxlIF9fdTE2KSgqKHZvbGF0aWxlIF9fdTE2ICopKHVuc2lnbmVkIGxvbmcpYWRyKSkKKworI2RlZmluZSBHUElPMV9EQVRBSU4JCTB4ZmZmYmU0MmMKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkgIAl3aGlsZSghKCgqKHZvbGF0aWxlIF9fdTE2ICopKEdQSU8xX0RBVEFJTikgJiAweDA0MDApID09IDB4MDQwMCkpOworIAorI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworCisjZW5kaWYJCQkJCQkJLyogX19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDIwaDQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ5NWQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQyMGg0LmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA1IFRleGFzIEluc3RydW1lbnRzLgorICogCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNMTEzNiAgICAgICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIGFybTExMzYgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDIwCSAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAyNDIwICovCisjZGVmaW5lIENPTkZJR19PTUFQMjQyMEg0ICAgICAgICAxICAgIC8qIGFuZCBvbiBhIEg0IGJvYXJkICovCisKKyNkZWZpbmUgQ09ORklHX09NQVAyNDJYCisKKyNkZWZpbmUgUFJDTV9DT05GSUdfSUkgICAgICAgICAgIDEgICAgCisvLyNkZWZpbmUgUFJDTV9DT05GSUdfSUlJICAgICAgICAgICAxICAgIAorI2RlZmluZSBDT05GSUdfUEFSVElBTF9TUkFNICAgICAgMQorCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX0REUgkJCTEKKyNkZWZpbmUgQ0ZHX1NEUkFNX0NPTUJPCQkyCisvLyNkZWZpbmUgQ0ZHX1NEUkFNX1NEUgkJCTMKKy8vI2RlZmluZSBDRkdfU0RSQU1fU1RBQ0tFRAkJNAorCSAKKy8qIENoaXBzZWxlY3QgYW5kIE5BTkQgaW5mb3JtYXRpb24gOgorICAgU2luY2Ugd2Ugc2hhcmUgdGhlIG1lbS5oIGZyb20gdS1ib290LCB3ZSBkZWZpbmUgZmV3IG1hY3JvcyBoZXJlCisgICBzbyBhcyB0byBwaWNrIHRoZSByaWdodCBncG1jIHZhbHVlcyBmcm9tIHRoZXJlIGZvciB0aGUgbWFjcm9zIGluIG1lbS5oCisqLworLyogTkFORCBmaXhlZCBhdCBDUzUgKi8KKyNkZWZpbmUgT01BUDI0WFhfR1BNQ19DUzAgU01OQU5ECisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzY0TQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9NQVAgQ0ZHX0ZMQVNIX0JBU0UKKyNkZWZpbmUgQ0ZHX05BTkRfQk9PVAorI2RlZmluZSBOQU5EX0xFR0FDWQorCisjaW5jbHVkZSA8YXNtL2FyY2gvb21hcDI0MjAuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIDEyMDAwMDAwCisvKiBpbnB1dCBjbG9jayBvZiBQTEwgKi8KKy8qIHRoZSBPTUFQMjQyMCBINCBoYXMgMTJNSHosIDEzTUh6LCBvciAxOS4yTWh6IGNyeXN0YWwgaW5wdXQgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19DTEtfRlJFUSAgICAgIFZfU0NMSworCisjaWZkZWYgQ0ZHX1BSSU5URgorCisjZGVmaW5lIENGR19OUzE2NTUwCisjZGVmaW5lIENGR19OUzE2NTUwX1NFUklBTAorI2RlZmluZSBDRkdfTlMxNjU1MF9SRUdfU0laRQkoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSwkJKDQ4MDAwMDAwKQkvKiBjYW4gYmUgMTJNLzMyS2h6IG9yIDQ4TWh6ICovCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMjQyMF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gSDQgKi8KKworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUJMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSIAkweDgwMDAwMDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4KjEwMjQpCS8qIHJlZ3VsYXIgc3RhY2sgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19OQU5EX0s5SzEyMTYgICAgLyogU2Ftc3VuZyAxNi1iaXQgNjRNQiBjaGlwICovCisKKyNkZWZpbmUgTkFORF9BRERSIDB4MDQwMDAwMDAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgdG8gYWNjZXNzIG5hbmQgYXQgQ1MwKi8KKyAKKy8qIEg0IE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAgLSAweDAwMTAwMDAgCUJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAxMDAwMCAtIDB4MDA1MDAwMCAJVS1Cb290IEltYWdlCisgKiAweDAwNTAwMDAgLSAweDAwODAwMDAgCVUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDgwMDAwIC0gMHg0MDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwNDAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA4MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgZG8geyoodm9sYXRpbGUgdTE2ICopMHg2ODAwQTA3QyA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDgwID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKikweDY4MDBBMDg0ID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpICgqKHZvbGF0aWxlIHUxNiAqKTB4NjgwMEEwODQpCisKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyAgCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKSgweDY4MDBBMDUwKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoMHg2ODAwQTA1MCkgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorICAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpICAgIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0NUTF9TRVRDTEUoYWRyKSAgICAgICAgIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAgICAgCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkgICAgICAgCisKKworI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAyNDMwc2RwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYTYxZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMjQzMHNkcC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA0IFRleGFzIEluc3RydW1lbnRzLgorICogCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIEg0IGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNMTEzNiAgICAgICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIGFybTExMzYgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAyNDMwSDQgICAgICAgIDEgICAgLyogYW5kIG9uIGEgSDQgYm9hcmQgKi8KKworI2RlZmluZSBDT05GSUdfT01BUDI0M1ggMQorCisvLyNkZWZpbmUgUFJDTV9DT05GSUdfNUEJCSAxCisjZGVmaW5lIFBSQ01fQ09ORklHXzIgICAgICAgICAgIDEgLyogMjQzMCBFUzIrMzMwQVJNK0REUi0xNjUtUElTTU8gKi8KKworI2RlZmluZSBPTUFQMjQzMF9TUVVBUkVfQ0xPQ0tfSU5QVVQgMQorCisvKiBNZW1vcnkgdHlwZSAqLworLy8jZGVmaW5lIENGR19TRFJBTV9ERFIJCQkxIC8qIG5vdCB0ZXN0ZWQgKi8KKy8vI2RlZmluZSBDRkdfU0RSQU1fQ09NQk8JCTIgLyogbm90IHRlc3RlZCAqLworI2RlZmluZSBDRkdfMjQzMFNEUkFNX0REUgkJMworLy8jZGVmaW5lIENGR19TRFJBTV9TVEFDS0VECQk0IC8qIG5vdCB0ZXN0ZWQgKi8KKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgMQorCisvKiBCb290IHR5cGUgKi8KKy8vI2RlZmluZSBDRkdfTkFORCAxCisjZGVmaW5lIENGR19PTkVOQU5EIDEKKworIyBkZWZpbmUgTkFORF9CQVNFICAgICAgICAgICAgMHgwQzAwMDAwMCAgLyogTkFORCBmbGFzaCAqLworIyBkZWZpbmUgT05FTkFORF9CQVNFCSAgICAgIDB4MjAwMDAwMDAgIC8qIE9uZU5hbmQgZmxhc2ggKi8KKworI2lmZGVmIENGR19OQU5ECisjZGVmaW5lIE5BTkRfTEVHQUNZCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzY0TQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9NQVAgTkFORF9CQVNFCisjZWxzZQorI2RlZmluZSBPTUFQMjRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAyNFhYX0dQTUNfQ1MwX01BUCBPTkVOQU5EX0JBU0UKKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyB0byBhY2Nlc3MgT25lTkFORCBhdCBDUzAqLworI2VuZGlmCisKKy8qIEFub3RoZXIgZGVwZW5kZW5jeSBvbiB1LWJvb3QgKi8KKyNkZWZpbmUgc2RlbGF5IGRlbGF5CisJIAorI2luY2x1ZGUgPGFzbS9hcmNoL29tYXAyNDMwLmg+ICAgICAgICAvKiBnZXQgY2hpcCBhbmQgYm9hcmQgZGVmcyAqLworCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAxMzAwMDAwMAorLyogaW5wdXQgY2xvY2sgb2YgUExMICovCisvKiB0aGUgT01BUDI0MjAgSDQgaGFzIDEyTUh6LCAxM01Ieiwgb3IgMTkuMk1oeiBjcnlzdGFsIGlucHV0ICovCisjZGVmaW5lIENPTkZJR19TWVNfQ0xLX0ZSRVEgICAgICBWX1NDTEsKKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUJKC00KQorI2RlZmluZSBDRkdfTlMxNjU1MF9DTEsJCSg0ODAwMDAwMCkJLyogY2FuIGJlIDEyTS8zMktoeiBvciA0OE1oeiAqLworI2RlZmluZSBDRkdfTlMxNjU1MF9DT00xICAgICAgICAgT01BUDI0MzBfVUFSVDEKKyAKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIDI0MzBTRFAgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDEKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFCTI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAJMHg4MDAwODAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUJKDEyOCoxMDI0KQkvKiByZWd1bGFyIHN0YWNrICovCisKKyNpZmRlZiBDRkdfTkFORAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCb2FyZCBOQU5EIEluZm8uCisgKi8KKyNkZWZpbmUgQ0ZHX05BTkRfSzlLMTIxNiAgICAvKiBTYW1zdW5nIDE2LWJpdCA2NE1CIGNoaXAgKi8KKworLyogTkFORCBpcyBwYXJ0aXRpb25lZDoKKyAqIDB4MDAwMDAwMCAtIDB4MDAxMDAwMCAJQm9vdGluZyBJbWFnZQorICogMHgwMDEwMDAwIC0gMHgwMDUwMDAwIAlVLUJvb3QgSW1hZ2UKKyAqIDB4MDA1MDAwMCAtIDB4MDA4MDAwMCAJVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAweDAwODAwMDAgLSAweDAwQjAwMDAgCUtlcm5lbCBJbWFnZQorICogMHgwMEIwMDAwIC0gMHg0MDAwMDAwIAlkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVAkweDAwNDAwMDAKKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQJCTB4MDA4MDAwMAorI2RlZmluZSBOQU5EX0JMT0NLX1NJWkUJCTB4NDAwMAorICAKKyNkZWZpbmUgR1BNQ19DT05GSUcJCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg1MCkKKyNkZWZpbmUgR1BNQ19OQU5EX0NPTU1BTkRfMAkoT01BUDI0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAJKE9NQVAyNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wCShPTUFQMjRYWF9HUE1DX0JBU0UrMHg4NCkKKworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQ09NTUFORF8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkRfQUREUkVTUyhkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgKCoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCkKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2RlZmluZSBOQU5EX0NUTF9DTFJBTEUoYWRyKSAgICAKKyNkZWZpbmUgTkFORF9DVExfU0VUQUxFKGFkcikgICAgCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpICAgICAgICAgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpICAgICAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAgICAgICAKKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgICAgICAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgICAgICAgVS1ib290IEltYWdlCisgKiAgIDB4MDBjMDAwMCAtIDB4MDBlMDAwMCAgICAgICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDBlMDAwMCAtIDB4MDEyMDAwMCAgICAgICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgICAgICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgICAgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICAgICAgIAk2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAgICAgICAgMjA0OCAgICAgICAgICAgIC8qIDJLQiAqLworI2RlZmluZSBPTkVOQU5EX0JMT0NLX1NJWkUgICAgICAgICAgICAgIDB4MjAwMDAgICAgICAgICAvKiAxMjhLQiAqLworCisjZW5kaWYgLy8gb25lTkFORAorI2VuZGlmCQkJCQkJCS8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwMzQzMGxhYnJhZG9yLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBsYWJyYWRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2MDg4NzIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBsYWJyYWRvci5oCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA2IAorICogVGV4YXMgSW5zdHJ1bWVudHMgPHd3dy50aS5jb20+CisgKiBSaWNoYXJkIFdvb2RydWZmIDxyLXdvb2RydWZmMkB0aS5jb20+CisgKgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgVEkgT01BUCBTRFAzNDMwIGJvYXJkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGIAorLy8jdW5kZWYgQ0ZHX1BSSU5URiAKKworLyoKKyAqIEhpZ2ggTGV2ZWwgQ29uZmlndXJhdGlvbiBPcHRpb25zCisgKi8KKyNkZWZpbmUgQ09ORklHX0FSTUNPUlRFWEE4ICAgICAgIDEgICAgLyogVGhpcyBpcyBhbiBBUk0gVjcgQ1BVIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAgICAgICAgICAgICAgIDEgICAgLyogaW4gYSBUSSBPTUFQIGNvcmUgKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNFhYICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgYSAzNFhYICovCisjZGVmaW5lIENPTkZJR19PTUFQMzQzMCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGluIGEgMzQzMCAqLworI2RlZmluZSBDT05GSUdfMzQzMExBQlJBRE9SICAgICAgMSAgICAvKiB3b3JraW5nIG9uIExhYnJhZG9yICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBfQVNfMzQxMCAgICAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKyNpbmNsdWRlIDxhc20vYXJjaC9jcHUuaD4gICAgICAgIC8qIGdldCBjaGlwIGFuZCBib2FyZCBkZWZzICovCisKKy8qIHVuY29tbWVudCBpdCBpZiB5b3UgbmVlZCB0aW1lciBiYXNlZCB1ZGVsYXkoKS4gaXQgdGFrZXMgYWJvdXQgMjUwIGJ5dGVzICovCisvLyNkZWZpbmUgQ0ZHX1VERUxBWQorIAorLyogQ2xvY2sgRGVmaW5lcyAqLworI2RlZmluZSBWX09TQ0sgICAgICAgICAgICAgICAgICAgMjYwMDAwMDAgIC8qIENsb2NrIG91dHB1dCBmcm9tIFQyICovCisKKyNpZiAoVl9PU0NLID4gMTkyMDAwMDApICAgICAgICAgIAorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8yNjZNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTUwME1IeiAtIFZERDE9MS4yMHYgKi8KKworLyogTWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHXzM0MzBTRFJBTV9ERFIgICAgICAgIDEKKworLyogVGhlIGFjdHVhbCByZWdpc3RlciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdS1ib290LSBtZW0uaCAqLworLyogU0RSQU0gQmFuayBBbGxvY2F0aW9uIG1ldGhvZCAqLworLy8jZGVmaW5lIFNEUkNfQl9SX0MgICAgICAgICAgICAgMQorLy8jZGVmaW5lIFNEUkNfQjFfUl9CMF9DICAgICAgICAgMQorI2RlZmluZSBTRFJDX1JfQl9DICAgICAgICAgICAgICAgMQorCisvKiBCb290IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHX05BTkQgMQorLy8jZGVmaW5lIENGR19PTkVOQU5EIDEKKworIyBkZWZpbmUgTkFORF9CQVNFX0FEUiAgICAgICAgICAgTkFORF9CQVNFICAvKiBOQU5EIGZsYXNoICovCisjIGRlZmluZSBPTkVOQU5EX0JBU0UgICAgICAgICAgICBPTkVOQU5EX01BUCAgLyogT25lTmFuZCBmbGFzaCAqLworCisjaWZkZWYgQ0ZHX05BTkQKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TSAgLyogdSA9IG9mZG9uJ3QgbmVlZCBzbyBtdWNoIGZvciBuYW5kIHBvcnQgKi8KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE5BTkRfQkFTRV9BRFIKKyNlbHNlCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX1NJWkUgR1BNQ19TSVpFXzEyOE0KKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfTUFQIE9ORU5BTkRfQkFTRQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKyNlbmRpZgorCisKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTMgICAgICAgICBPTUFQMzRYWF9VQVJUMworIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDMgICAgICAgICAgIDMgICAgLyogVUFSVDMgb24gYm9hcmQgKi8KKyNkZWZpbmUgQ09ORklHX0NPTlNfSU5ERVggICAgICAgIDMKKworI2RlZmluZSBDT05GSUdfQkFVRFJBVEUgICAgICAgICAgMTE1MjAwCisjZGVmaW5lIENGR19QQlNJWkUgICAgICAgICAgICAgICAyNTYKKworI2VuZGlmIC8qIENGR19QUklOVEYgKi8KKworLyoKKyAqIE1pc2NlbGxhbmVvdXMgY29uZmlndXJhYmxlIG9wdGlvbnMKKyAqLworI2RlZmluZSBDRkdfTE9BREFERFIgICAgICAgICAgICAgMHg4MDAwODAwMAorICAKKyN1bmRlZglDRkdfQ0xLU19JTl9IWgkJLyogZXZlcnl0aGluZywgaW5jbCBib2FyZCBpbmZvLCBpbiBIeiAqLworIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogU3RhY2sgc2l6ZXMKKyAqCisgKiBUaGUgc3RhY2sgc2l6ZXMgYXJlIHNldCB1cCBpbiBzdGFydC5TIHVzaW5nIHRoZSBzZXR0aW5ncyBiZWxvdworICovCisjZGVmaW5lIENPTkZJR19TVEFDS1NJWkUgICAgICAgICAoMTI4KjEwMjQpIC8qIHJlZ3VsYXIgc3RhY2sgKi8KKworI2lmZGVmIENGR19OQU5ECisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBNaWNyb24gMTYtYml0IDI1Nk1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzE2QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAwQkZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDBDMDAwMCAtIDB4MDAwRkZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDEwMDAwMCAtIDB4MDAyRkZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDMwMDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMEMwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKyAgCisjZGVmaW5lIEdQTUNfQ09ORklHICAgICAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4NTApCisjZGVmaW5lIEdQTUNfTkFORF9DT01NQU5EXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4N0MpCisjZGVmaW5lIEdQTUNfTkFORF9BRERSRVNTXzAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODApCisjZGVmaW5lIEdQTUNfTkFORF9EQVRBXzAgICAgICAgICAoT01BUDM0WFhfR1BNQ19CQVNFKzB4ODQpCisKKyNpZmRlZiBOQU5EXzE2QklUCisjZGVmaW5lIFdSSVRFX05BTkRfQ09NTUFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTE2ICopR1BNQ19OQU5EX0RBVEFfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBSRUFEX05BTkQoYWRyKSBcCisgICAgICAgICgqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzApCisjZGVmaW5lIE5BTkRfV0FJVF9SRUFEWSgpCisjZGVmaW5lIE5BTkRfV1BfT0ZGKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSB8PSAweDAwMDAwMDEwO30gd2hpbGUoMCkKKyNkZWZpbmUgTkFORF9XUF9PTigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgJj0gfjB4MDAwMDAwMTA7fSB3aGlsZSgwKQorCisjZWxzZSAvKiB0byBzdXBwb3J0IDgtYml0IE5BTkQgZGV2aWNlcyAqLworI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0NPTU1BTkRfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EX0FERFJFU1MoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHU4ICopR1BNQ19OQU5EX0FERFJFU1NfMCA9IGQ7fSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9OQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9EQVRBXzApOworI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2VuZGlmCisKKyNkZWZpbmUgTkFORF9DVExfQ0xSQUxFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9DTFJDTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfU0VUQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpIAorI2RlZmluZSBOQU5EX0VOQUJMRV9DRSgpIAorCisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIgCisgKiAgIDB4MDA4MDAwMCAtIDB4MDBjMDAwMCAgIFUtYm9vdCBJbWFnZQorICogICAweDAwYzAwMDAgLSAweDAwZTAwMDAgICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqICAgMHgwMGUwMDAwIC0gMHgwMTIwMDAwICAgS2VybmVsIEltYWdlCisgKiAgIDB4MDEyMDAwMCAtIDB4NDAwMDAwMCAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworCisjZGVmaW5lIE9ORU5BTkRfU1RBUlRfQkxPQ0sgICAgICA0CisjZGVmaW5lIE9ORU5BTkRfRU5EX0JMT0NLICAgICAgICA2CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAgLyogb25lTkFORCAqLworI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmggYi94LWxvYWRlci9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDg4MGVkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzNDMwc2RwLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDYgCisgKiBUZXhhcyBJbnN0cnVtZW50cyA8d3d3LnRpLmNvbT4KKyAqIFJpY2hhcmQgV29vZHJ1ZmYgPHItd29vZHJ1ZmYyQHRpLmNvbT4KKyAqCisgKiBYLUxvYWRlciBDb25maWd1YXRpb24gc2V0dGluZ3MgZm9yIHRoZSBUSSBPTUFQIFNEUDM0MzAgYm9hcmQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTkZJR19ICisjZGVmaW5lIF9fQ09ORklHX0gKKworLyogc2VyaWFsIHByaW50ZiBmYWNpbGl0eSB0YWtlcyBhYm91dCAzLjVLICovCisjZGVmaW5lIENGR19QUklOVEYgCisvLyN1bmRlZiBDRkdfUFJJTlRGIAorCisvKgorICogSGlnaCBMZXZlbCBDb25maWd1cmF0aW9uIE9wdGlvbnMKKyAqLworI2RlZmluZSBDT05GSUdfQVJNQ09SVEVYQTggICAgICAgMSAgICAvKiBUaGlzIGlzIGFuIEFSTSBWNyBDUFUgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUCAgICAgICAgICAgICAgMSAgICAvKiBpbiBhIFRJIE9NQVAgY29yZSAqLworI2RlZmluZSBDT05GSUdfT01BUDM0WFggICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBhIDM0WFggKi8KKyNkZWZpbmUgQ09ORklHX09NQVAzNDMwICAgICAgICAgIDEgICAgLyogd2hpY2ggaXMgaW4gYSAzNDMwICovCisjZGVmaW5lIENPTkZJR18zNDMwU0RQICAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBTRFAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMF9BU18zNDEwCSAxICAgIC8qIHRydWUgZm9yIDM0MzAgaW4gMzQxMCBtb2RlICovCisKKy8qIEVuYWJsZSB0aGUgYmVsb3cgbWFjcm8gaWYgTU1DIGJvb3Qgc3VwcG9ydCBpcyByZXF1aXJlZCAqLworLy8jZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisgCisvKiBDbG9jayBEZWZpbmVzICovCisjZGVmaW5lIFZfT1NDSyAgICAgICAgICAgICAgICAgICAxOTIwMDAwMCAgLyogQ2xvY2sgb3V0cHV0IGZyb20gVDIgKi8KKworI2lmIChWX09TQ0sgPiAxOTIwMDAwMCkgICAgICAgICAgCisjZGVmaW5lIFZfU0NMSyAgICAgICAgICAgICAgICAgICAoVl9PU0NLID4+IDEpCisjZWxzZQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgVl9PU0NLCisjZW5kaWYKKworLy8jZGVmaW5lIFBSQ01fQ0xLX0NGRzJfMjY2TUhaICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTMzTUh6IEREUiAqLworI2RlZmluZSBQUkNNX0NMS19DRkcyXzMzMk1IWiAgICAgMSAgICAvKiBWREQyPTEuMTV2IC0gMTY2TUh6IEREUiAqLworI2RlZmluZSBQUkNNX1BDTEtfT1BQMiAgICAgICAgICAgMSAgICAvKiBBUk09MzgxTUh6IC0gVkREMT0xLjIwdiAqLworCisvKiBNZW1vcnkgdHlwZSAqLworI2RlZmluZSBDRkdfMzQzMFNEUkFNX0REUiAgICAgICAgMQorCisvKiBUaGUgYWN0dWFsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiB1LWJvb3QtIG1lbS5oICovCisvKiBTRFJBTSBCYW5rIEFsbG9jYXRpb24gbWV0aG9kICovCisvLyNkZWZpbmUgU0RSQ19CX1JfQyAgICAgICAgICAgICAxCisvLyNkZWZpbmUgU0RSQ19CMV9SX0IwX0MgICAgICAgICAxCisjZGVmaW5lIFNEUkNfUl9CX0MgICAgICAgICAgICAgICAxCisKKy8qIEJvb3QgdHlwZSAqLworI2RlZmluZSBDRkdfTkFORCAxCisvLyNkZWZpbmUgQ0ZHX09ORU5BTkQgMQorCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNpZmRlZiBDRkdfTkFORAorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBOQU5EX0JBU0VfQURSCisjZWxzZQorI2RlZmluZSBPTUFQMzRYWF9HUE1DX0NTMF9TSVpFIEdQTUNfU0laRV8xMjhNCisjZGVmaW5lIE9NQVAzNFhYX0dQTUNfQ1MwX01BUCBPTkVOQU5EX0JBU0UKKyNkZWZpbmUgT05FTkFORF9BRERSIE9ORU5BTkRfQkFTRSAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBPbmVOQU5EIGF0IENTMCovCisjZW5kaWYKKyAKKyNpZmRlZiBDRkdfUFJJTlRGCisKKyNkZWZpbmUgQ0ZHX05TMTY1NTAKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfU0VSSUFMCisjZGVmaW5lIENGR19OUzE2NTUwX1JFR19TSVpFICAgICAoLTQpCisjZGVmaW5lIENGR19OUzE2NTUwX0NMSyAgICAgICAgICAoNDgwMDAwMDApCisjZGVmaW5lIENGR19OUzE2NTUwX0NPTTEgICAgICAgICBPTUFQMzRYWF9VQVJUMQorIAorLyoKKyAqIHNlbGVjdCBzZXJpYWwgY29uc29sZSBjb25maWd1cmF0aW9uCisgKi8KKyNkZWZpbmUgQ09ORklHX1NFUklBTDEgICAgICAgICAgIDEgICAgLyogVUFSVDEgb24gMzQzMFNEUCAqLworI2RlZmluZSBDT05GSUdfQ09OU19JTkRFWCAgICAgICAgMQorCisjZGVmaW5lIENPTkZJR19CQVVEUkFURSAgICAgICAgICAxMTUyMDAKKyNkZWZpbmUgQ0ZHX1BCU0laRSAgICAgICAgICAgICAgIDI1NgorCisjZW5kaWYgLyogQ0ZHX1BSSU5URiAqLworCisvKgorICogTWlzY2VsbGFuZW91cyBjb25maWd1cmFibGUgb3B0aW9ucworICovCisjZGVmaW5lIENGR19MT0FEQUREUiAgICAgICAgICAgICAweDgwMDA4MDAwCisgIAorI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTdGFjayBzaXplcworICoKKyAqIFRoZSBzdGFjayBzaXplcyBhcmUgc2V0IHVwIGluIHN0YXJ0LlMgdXNpbmcgdGhlIHNldHRpbmdzIGJlbG93CisgKi8KKyNkZWZpbmUgQ09ORklHX1NUQUNLU0laRSAgICAgICAgICgxMjgqMTAyNCkgLyogcmVndWxhciBzdGFjayAqLworCisjaWZkZWYgQ0ZHX05BTkQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgTkFORCBJbmZvLgorICovCisKKworI2RlZmluZSBDRkdfTkFORF9LOUYxRzA4UjBBICAgIC8qIFNhbXN1bmcgOC1iaXQgMTI4TUIgY2hpcCBsYXJnZSBwYWdlIE5BTkQgY2hpcCovCisjZGVmaW5lIE5BTkRfOEJJVAorCisvKiBOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogMHgwMDAwMDAwMCAtIDB4MDAwN0ZGRkYgIEJvb3RpbmcgSW1hZ2UKKyAqIDB4MDAwODAwMDAgLSAweDAwMEJGRkZGICBVLUJvb3QgSW1hZ2UKKyAqIDB4MDAwQzAwMDAgLSAweDAwMEZGRkZGICBVLUJvb3QgRW52IERhdGEgKFgtbG9hZGVyIGRvZXNuJ3QgY2FyZSkKKyAqIDB4MDAxMDAwMDAgLSAweDAwMkZGRkZGICBLZXJuZWwgSW1hZ2UKKyAqIDB4MDAzMDAwMDAgLSAweDA4MDAwMDAwICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9TVEFSVCAgICAgICAgIDB4MDA4MDAwMCAvKiBMZWF2aW5nIGZpcnN0IDQgYmxvY2tzIGZvciB4LWxvYWQgKi8KKyNkZWZpbmUgTkFORF9VQk9PVF9FTkQgICAgICAgICAgIDB4MDBDMDAwMCAvKiBHaXZpbmcgYSBzcGFjZSBvZiAyIGJsb2NrcyA9IDI1NktCICovCisjZGVmaW5lIE5BTkRfQkxPQ0tfU0laRSAgICAgICAgICAweDIwMDAwCisgIAorI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpIAorI2RlZmluZSBOQU5EX0NUTF9TRVRBTEUoYWRyKSAKKyNkZWZpbmUgTkFORF9DVExfQ0xSQ0xFKGFkcikgCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpIAorI2RlZmluZSBOQU5EX0RJU0FCTEVfQ0UoKSAKKyNkZWZpbmUgTkFORF9FTkFCTEVfQ0UoKSAKKworI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIG9uZU5BTkQgSW5mby4KKyAqLworI2RlZmluZSBDRkdfU1lOQ19CVVJTVF9SRUFEICAgICAgMQorCisvKiBPbmVOQU5EIGlzIHBhcnRpdGlvbmVkOgorICogICAweDAwMDAwMDAgLSAweDAwODAwMDAgIFgtTG9hZGVyIAorICogICAweDAwODAwMDAgLSAweDAwYzAwMDAgICBVLWJvb3QgSW1hZ2UKKyAqICAgMHgwMGMwMDAwIC0gMHgwMGUwMDAwICAgVS1Cb290IEVudiBEYXRhIChYLWxvYWRlciBkb2Vzbid0IGNhcmUpCisgKiAgIDB4MDBlMDAwMCAtIDB4MDEyMDAwMCAgIEtlcm5lbCBJbWFnZQorICogICAweDAxMjAwMDAgLSAweDQwMDAwMDAgICBkZXBlbmRzIG9uIGFwcGxpY2F0aW9uCisgKi8KKworI2RlZmluZSBPTkVOQU5EX1NUQVJUX0JMT0NLICAgICAgNAorI2RlZmluZSBPTkVOQU5EX0VORF9CTE9DSyAgICAgICAgNgorI2RlZmluZSBPTkVOQU5EX1BBR0VfU0laRSAgICAgICAgMjA0OCAgICAgLyogMktCICovCisjZGVmaW5lIE9ORU5BTkRfQkxPQ0tfU0laRSAgICAgICAweDIwMDAwICAvKiAxMjhLQiAqLworCisjZW5kaWYgIC8qIG9uZU5BTkQgKi8KKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oIGIveC1sb2FkZXIvaW5jbHVkZS9jb25maWdzL29tYXAzZXZtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzgxMGExNwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvY29uZmlncy9vbWFwM2V2bS5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE1pc3RyYWwgU29sdXRpb25zIFB2dCBMdGQuCisgKgorICogWC1Mb2FkZXIgQ29uZmlndWF0aW9uIHNldHRpbmdzIGZvciB0aGUgT01BUDNFVk0gYm9hcmQuCisgKgorICogRGVyaXZlZCBmcm9tIC9pbmNsdWRlL2NvbmZpZ3Mvb21hcDM0MzBzZHAuaAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19DT05GSUdfSAorI2RlZmluZSBfX0NPTkZJR19ICisKKy8qIHNlcmlhbCBwcmludGYgZmFjaWxpdHkgdGFrZXMgYWJvdXQgMy41SyAqLworI2RlZmluZSBDRkdfUFJJTlRGCisvLyN1bmRlZiBDRkdfUFJJTlRGCisKKy8qCisgKiBIaWdoIExldmVsIENvbmZpZ3VyYXRpb24gT3B0aW9ucworICovCisjZGVmaW5lIENPTkZJR19BUk1DT1JURVhBOCAgICAgICAxICAgIC8qIFRoaXMgaXMgYW4gQVJNIFY3IENQVSBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQICAgICAgICAgICAgICAxICAgIC8qIGluIGEgVEkgT01BUCBjb3JlICovCisjZGVmaW5lIENPTkZJR19PTUFQMzRYWCAgICAgICAgICAxICAgIC8qIHdoaWNoIGlzIGEgMzRYWCAqLworI2RlZmluZSBDT05GSUdfT01BUDM0MzAgICAgICAgICAgMSAgICAvKiB3aGljaCBpcyBpbiBhIDM0MzAgKi8KKy8vI2RlZmluZSBDT05GSUdfMzQzMFNEUCAgICAgICAgICAgMSAgICAvKiB3b3JraW5nIHdpdGggU0RQICovCisvLyNkZWZpbmUgQ09ORklHXzM0MzBfQVNfMzQxMAkgMSAgICAvKiB0cnVlIGZvciAzNDMwIGluIDM0MTAgbW9kZSAqLworCisjZGVmaW5lIENPTkZJR19PTUFQM0VWTSAgICAgICAgICAxICAgIC8qIHdvcmtpbmcgd2l0aCBFVk0gKi8KKworLyogRW5hYmxlIHRoZSBiZWxvdyBtYWNybyBpZiBNTUMgYm9vdCBzdXBwb3J0IGlzIHJlcXVpcmVkICovCisjZGVmaW5lIENPTkZJR19NTUMgICAgICAgICAgICAgICAxCisjaWYgZGVmaW5lZChDT05GSUdfTU1DKQorCSNkZWZpbmUgQ0ZHX0NNRF9NTUMgICAgICAgICAgICAgIDEKKwkjZGVmaW5lIENGR19DTURfRkFUICAgICAgICAgICAgICAxCisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPiAgICAgICAgLyogZ2V0IGNoaXAgYW5kIGJvYXJkIGRlZnMgKi8KKworLyogdW5jb21tZW50IGl0IGlmIHlvdSBuZWVkIHRpbWVyIGJhc2VkIHVkZWxheSgpLiBpdCB0YWtlcyBhYm91dCAyNTAgYnl0ZXMgKi8KKy8vI2RlZmluZSBDRkdfVURFTEFZCisKKy8qIENsb2NrIERlZmluZXMgKi8KKyNkZWZpbmUgVl9PU0NLICAgICAgICAgICAgICAgICAgIDI2MDAwMDAwICAvKiBDbG9jayBvdXRwdXQgZnJvbSBUMiAqLworCisjaWYgKFZfT1NDSyA+IDE5MjAwMDAwKQorI2RlZmluZSBWX1NDTEsgICAgICAgICAgICAgICAgICAgKFZfT1NDSyA+PiAxKQorI2Vsc2UKKyNkZWZpbmUgVl9TQ0xLICAgICAgICAgICAgICAgICAgIFZfT1NDSworI2VuZGlmCisKKy8vI2RlZmluZSBQUkNNX0NMS19DRkcyXzI2Nk1IWiAgIDEgICAgLyogVkREMj0xLjE1diAtIDEzM01IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9DTEtfQ0ZHMl8zMzJNSFogICAgIDEgICAgLyogVkREMj0xLjE1diAtIDE2Nk1IeiBERFIgKi8KKyNkZWZpbmUgUFJDTV9QQ0xLX09QUDIgICAgICAgICAgIDEgICAgLyogQVJNPTM4MU1IeiAtIFZERDE9MS4yMHYgKi8KKworLyogTWVtb3J5IHR5cGUgKi8KKyNkZWZpbmUgQ0ZHX09NQVBFVk1fRERSCQkxCisjZGVmaW5lIENGR18zNDMwU0RSQU1fRERSCTEKKyNkZWZpbmUgQ09ORklHX0REUl8yNTZNQl9TVEFDS0VECisKKy8qIFRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHUtYm9vdC0gbWVtLmggKi8KKy8qIFNEUkFNIEJhbmsgQWxsb2NhdGlvbiBtZXRob2QgKi8KKy8vI2RlZmluZSBTRFJDX0JfUl9DICAgICAgICAgICAgIDEKKy8vI2RlZmluZSBTRFJDX0IxX1JfQjBfQyAgICAgICAgIDEKKyNkZWZpbmUgU0RSQ19SX0JfQyAgICAgICAgICAgICAgIDEKKworCisjIGRlZmluZSBOQU5EX0JBU0VfQURSICAgICAgICAgICBOQU5EX0JBU0UgIC8qIE5BTkQgZmxhc2ggKi8KKyMgZGVmaW5lIE9ORU5BTkRfQkFTRSAgICAgICAgICAgIE9ORU5BTkRfTUFQICAvKiBPbmVOYW5kIGZsYXNoICovCisKKyNkZWZpbmUgT01BUDM0WFhfR1BNQ19DUzBfU0laRSBHUE1DX1NJWkVfMTI4TQorI2RlZmluZSBPTkVOQU5EX0FERFIgT05FTkFORF9CQVNFICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIE9uZU5BTkQgYXQgQ1MwKi8KKworI2lmZGVmIENGR19QUklOVEYKKworI2RlZmluZSBDRkdfTlMxNjU1MAorI2RlZmluZSBDRkdfTlMxNjU1MF9TRVJJQUwKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfUkVHX1NJWkUgICAgICgtNCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ0xLICAgICAgICAgICg0ODAwMDAwMCkKKyNkZWZpbmUgQ0ZHX05TMTY1NTBfQ09NMSAgICAgICAgIE9NQVAzNFhYX1VBUlQxCisKKy8qCisgKiBzZWxlY3Qgc2VyaWFsIGNvbnNvbGUgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIENPTkZJR19TRVJJQUwxICAgICAgICAgICAxICAgIC8qIFVBUlQxIG9uIE9NQVAzRVZNICovCisjZGVmaW5lIENPTkZJR19DT05TX0lOREVYICAgICAgICAxCisKKyNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgIDExNTIwMAorI2RlZmluZSBDRkdfUEJTSVpFICAgICAgICAgICAgICAgMjU2CisKKyNlbmRpZiAvKiBDRkdfUFJJTlRGICovCisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIGNvbmZpZ3VyYWJsZSBvcHRpb25zCisgKi8KKyNkZWZpbmUgQ0ZHX0xPQURBRERSICAgICAgICAgICAgIDB4ODAwMDgwMDAKKworI3VuZGVmCUNGR19DTEtTX0lOX0haCQkvKiBldmVyeXRoaW5nLCBpbmNsIGJvYXJkIGluZm8sIGluIEh6ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFN0YWNrIHNpemVzCisgKgorICogVGhlIHN0YWNrIHNpemVzIGFyZSBzZXQgdXAgaW4gc3RhcnQuUyB1c2luZyB0aGUgc2V0dGluZ3MgYmVsb3cKKyAqLworI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAgKDEyOCoxMDI0KSAvKiByZWd1bGFyIHN0YWNrICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJvYXJkIE5BTkQgSW5mby4KKyAqLworCisKKyNkZWZpbmUgQ0ZHX05BTkRfSzlGMUcwOFIwQSAgICAvKiBTYW1zdW5nIDgtYml0IDEyOE1CIGNoaXAgbGFyZ2UgcGFnZSBOQU5EIGNoaXAqLworI2RlZmluZSBOQU5EXzE2QklUCisKKy8qIE5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAweDAwMDAwMDAwIC0gMHgwMDA3RkZGRiAgQm9vdGluZyBJbWFnZQorICogMHgwMDA4MDAwMCAtIDB4MDAyM0ZGRkYgIFUtQm9vdCBJbWFnZQorICogMHgwMDI0MDAwMCAtIDB4MDAyN0ZGRkYgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogMHgwMDI4MDAwMCAtIDB4MDA3N0ZGRkYgIEtlcm5lbCBJbWFnZQorICogMHgwMDc4MDAwMCAtIDB4MDgwMDAwMDAgIGRlcGVuZHMgb24gYXBwbGljYXRpb24KKyAqLworI2RlZmluZSBOQU5EX1VCT09UX1NUQVJUICAgICAgICAgMHgwMDgwMDAwIC8qIExlYXZpbmcgZmlyc3QgNCBibG9ja3MgZm9yIHgtbG9hZCAqLworI2RlZmluZSBOQU5EX1VCT09UX0VORCAgICAgICAgICAgMHgwMjQwMDAwIC8qIEdpdmluZyBhIHNwYWNlIG9mIDIgYmxvY2tzID0gMjU2S0IgKi8KKyNkZWZpbmUgTkFORF9CTE9DS19TSVpFICAgICAgICAgIDB4MjAwMDAKKworI2RlZmluZSBHUE1DX0NPTkZJRyAgICAgICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDUwKQorI2RlZmluZSBHUE1DX05BTkRfQ09NTUFORF8wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDdDKQorI2RlZmluZSBHUE1DX05BTkRfQUREUkVTU18wICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDgwKQorI2RlZmluZSBHUE1DX05BTkRfREFUQV8wICAgICAgICAgKE9NQVAzNFhYX0dQTUNfQkFTRSsweDg0KQorCisjaWZkZWYgTkFORF8xNkJJVAorI2RlZmluZSBXUklURV9OQU5EX0NPTU1BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfQUREUkVTU18wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFdSSVRFX05BTkQoZCwgYWRyKSBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUxNiAqKUdQTUNfTkFORF9EQVRBXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgUkVBRF9OQU5EKGFkcikgXAorICAgICAgICAoKih2b2xhdGlsZSB1MTYgKilHUE1DX05BTkRfREFUQV8wKQorI2RlZmluZSBOQU5EX1dBSVRfUkVBRFkoKQorI2RlZmluZSBOQU5EX1dQX09GRigpICBcCisgICAgICAgIGRvIHsqKHZvbGF0aWxlIHUzMiAqKShHUE1DX0NPTkZJRykgfD0gMHgwMDAwMDAxMDt9IHdoaWxlKDApCisjZGVmaW5lIE5BTkRfV1BfT04oKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpICY9IH4weDAwMDAwMDEwO30gd2hpbGUoMCkKKworI2Vsc2UgLyogdG8gc3VwcG9ydCA4LWJpdCBOQU5EIGRldmljZXMgKi8KKyNkZWZpbmUgV1JJVEVfTkFORF9DT01NQU5EKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9DT01NQU5EXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORF9BRERSRVNTKGQsIGFkcikgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1OCAqKUdQTUNfTkFORF9BRERSRVNTXzAgPSBkO30gd2hpbGUoMCkKKyNkZWZpbmUgV1JJVEVfTkFORChkLCBhZHIpIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wID0gZDt9IHdoaWxlKDApCisjZGVmaW5lIFJFQURfTkFORChhZHIpIFwKKyAgICAgICAgKCoodm9sYXRpbGUgdTggKilHUE1DX05BTkRfREFUQV8wKTsKKyNkZWZpbmUgTkFORF9XQUlUX1JFQURZKCkKKyNkZWZpbmUgTkFORF9XUF9PRkYoKSAgXAorICAgICAgICBkbyB7Kih2b2xhdGlsZSB1MzIgKikoR1BNQ19DT05GSUcpIHw9IDB4MDAwMDAwMTA7fSB3aGlsZSgwKQorI2RlZmluZSBOQU5EX1dQX09OKCkgIFwKKyAgICAgICAgZG8geyoodm9sYXRpbGUgdTMyICopKEdQTUNfQ09ORklHKSAmPSB+MHgwMDAwMDAxMDt9IHdoaWxlKDApCisKKyNlbmRpZgorCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVEFMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX0NMUkNMRShhZHIpCisjZGVmaW5lIE5BTkRfQ1RMX1NFVENMRShhZHIpCisjZGVmaW5lIE5BTkRfRElTQUJMRV9DRSgpCisjZGVmaW5lIE5BTkRfRU5BQkxFX0NFKCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQm9hcmQgb25lTkFORCBJbmZvLgorICovCisjZGVmaW5lIENGR19TWU5DX0JVUlNUX1JFQUQgICAgICAxCisKKy8qIE9uZU5BTkQgaXMgcGFydGl0aW9uZWQ6CisgKiAgIDB4MDAwMDAwMCAtIDB4MDA4MDAwMCAgWC1Mb2FkZXIKKyAqICAgMHgwMDgwMDAwIC0gMHgwMjQwMDAwICAgVS1ib290IEltYWdlCisgKiAgIDB4MDI0MDAwMCAtIDB4MDI4MDAwMCAgIFUtQm9vdCBFbnYgRGF0YSAoWC1sb2FkZXIgZG9lc24ndCBjYXJlKQorICogICAweDAyODAwMDAgLSAweDA3ODAwMDAgICBLZXJuZWwgSW1hZ2UKKyAqICAgMHgwNzgwMDAwIC0gMHg4MDAwMDAwICAgZGVwZW5kcyBvbiBhcHBsaWNhdGlvbgorICovCisKKyNkZWZpbmUgT05FTkFORF9TVEFSVF9CTE9DSyAgICAgIDQKKyNkZWZpbmUgT05FTkFORF9FTkRfQkxPQ0sgICAgICAgIDE4CisjZGVmaW5lIE9ORU5BTkRfUEFHRV9TSVpFICAgICAgICAyMDQ4ICAgICAvKiAyS0IgKi8KKyNkZWZpbmUgT05FTkFORF9CTE9DS19TSVpFICAgICAgIDB4MjAwMDAgIC8qIDEyOEtCICovCisKKyNlbmRpZiAvKiBfX0NPTkZJR19IICovCisKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvZmF0LmggYi94LWxvYWRlci9pbmNsdWRlL2ZhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNTczYmEKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2ZhdC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZworICoKKyAqIDIwMDItMDctMjggLSByam9uZXNAbmV4dXMtdGVjaC5uZXQgLSBwb3J0ZWQgdG8gcHBjYm9vdCB2MS4xLjYKKyAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHUtYm9vdAorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaWZuZGVmIF9GQVRfSF8KKyNkZWZpbmUgX0ZBVF9IXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjZGVmaW5lIENPTkZJR19TVVBQT1JUX1ZGQVQKKworI2RlZmluZSBTRUNUT1JfU0laRSBGU19CTE9DS19TSVpFCisKKyNkZWZpbmUgRlNfQkxPQ0tfU0laRSA1MTIKKworI2lmIEZTX0JMT0NLX1NJWkUgIT0gU0VDVE9SX1NJWkUKKyNlcnJvciBGU19CTE9DS19TSVpFICE9IFNFQ1RPUl9TSVpFIC0gVGhpcyBjb2RlIG5lZWRzIHRvIGJlIGZpeGVkIQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0NMVVNUU0laRQk2NTUzNgorI2RlZmluZSBESVJFTlRTUEVSQkxPQ0sJKEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGRpcl9lbnRyeSkpCisjZGVmaW5lIERJUkVOVFNQRVJDTFVTVAkoKG15ZGF0YS0+Y2x1c3Rfc2l6ZSpTRUNUT1JfU0laRSkvc2l6ZW9mKGRpcl9lbnRyeSkpCisKKyNkZWZpbmUgRkFUQlVGQkxPQ0tTCTYKKyNkZWZpbmUgRkFUQlVGU0laRQkoRlNfQkxPQ0tfU0laRSpGQVRCVUZCTE9DS1MpCisjZGVmaW5lIEZBVDEyQlVGU0laRQkoKEZBVEJVRlNJWkUqMikvMykKKyNkZWZpbmUgRkFUMTZCVUZTSVpFCShGQVRCVUZTSVpFLzIpCisjZGVmaW5lIEZBVDMyQlVGU0laRQkoRkFUQlVGU0laRS80KQorCisKKy8qIEZpbGVzeXN0ZW0gaWRlbnRpZmllcnMgKi8KKyNkZWZpbmUgRkFUMTJfU0lHTgkiRkFUMTIgICAiCisjZGVmaW5lIEZBVDE2X1NJR04JIkZBVDE2ICAgIgorI2RlZmluZSBGQVQzMl9TSUdOCSJGQVQzMiAgICIKKyNkZWZpbmUgU0lHTkxFTgkJNworCisvKiBGaWxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgQVRUUl9STyAgICAgIDEKKyNkZWZpbmUgQVRUUl9ISURERU4gIDIKKyNkZWZpbmUgQVRUUl9TWVMgICAgIDQKKyNkZWZpbmUgQVRUUl9WT0xVTUUgIDgKKyNkZWZpbmUgQVRUUl9ESVIgICAgIDE2CisjZGVmaW5lIEFUVFJfQVJDSCAgICAzMgorCisjZGVmaW5lIEFUVFJfVkZBVCAgICAgKEFUVFJfUk8gfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTIHwgQVRUUl9WT0xVTUUpCisKKyNkZWZpbmUgREVMRVRFRF9GTEFHCSgoY2hhcikweGU1KSAvKiBNYXJrcyBkZWxldGVkIGZpbGVzIHdoZW4gaW4gbmFtZVswXSAqLworI2RlZmluZSBhUklORwkJMHgwNQkgICAgIC8qIFVzZWQgdG8gcmVwcmVzZW50ICflJyBpbiBuYW1lWzBdICovCisKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBpcyB0aGUgbGFzdCBsb25nIGVudHJ5IGluIGEgc2V0IG9mIGxvbmcKKyAqIGRpciBlbnRyaWVzCisgKi8KKyNkZWZpbmUgTEFTVF9MT05HX0VOVFJZX01BU0sJMHg0MAorCisvKiBGbGFncyB0ZWxsaW5nIHdoZXRoZXIgd2Ugc2hvdWxkIHJlYWQgYSBmaWxlIG9yIGxpc3QgYSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgTFNfTk8JMAorI2RlZmluZSBMU19ZRVMJMQorI2RlZmluZSBMU19ESVIJMQorI2RlZmluZSBMU19ST09UCTIKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIEZBVF9EUFJJTlQoYXJncy4uLikJcHJpbnRmKGFyZ3MpCisjZWxzZQorI2RlZmluZSBGQVRfRFBSSU5UKGFyZ3MuLi4pCisjZW5kaWYKKyNkZWZpbmUgRkFUX0VSUk9SKGFyZykJCXByaW50ZihhcmcpCisKKyNkZWZpbmUgSVNESVJERUxJTShjKSAgICgoYykgPT0gJy8nIHx8IChjKSA9PSAnXFwnKQorCisjZGVmaW5lIEZTVFlQRV9OT05FCSgtMSkKKworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisjZGVmaW5lIEZBVDJDUFUxNglsZTE2X3RvX2NwdQorI2RlZmluZSBGQVQyQ1BVMzIJbGUzMl90b19jcHUKKyNlbHNlCisjaWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIEZBVDJDUFUxNih4KQkoeCkKKyNkZWZpbmUgRkFUMkNQVTMyKHgpCSh4KQorI2Vsc2UKKyNkZWZpbmUgRkFUMkNQVTE2KHgpCSgoKCh4KSAmIDB4MDBmZikgPDwgOCkgfCAoKCh4KSAmIDB4ZmYwMCkgPj4gOCkpCisjZGVmaW5lIEZBVDJDUFUzMih4KQkoKCgoeCkgJiAweDAwMDAwMGZmKSA8PCAyNCkgIHwJXAorCSAJCSAoKCh4KSAmIDB4MDAwMGZmMDApIDw8IDgpICB8CVwKKwkJCSAoKCh4KSAmIDB4MDBmZjAwMDApID4+IDgpICB8CVwKKwkJCSAoKCh4KSAmIDB4ZmYwMDAwMDApID4+IDI0KSkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVE9MT1dFUihjKQlpZigoYykgPj0gJ0EnICYmIChjKSA8PSAnWicpeyhjKSs9KCdhJyAtICdBJyk7fQorI2RlZmluZSBTVEFSVChkZW50KQkoRkFUMkNQVTE2KChkZW50KS0+c3RhcnQpIFwKKwkJCSsgKG15ZGF0YS0+ZmF0c2l6ZSAhPSAzMiA/IDAgOiBcCisJCQkgIChGQVQyQ1BVMTYoKGRlbnQpLT5zdGFydGhpKSA8PCAxNikpKQorCisKK3R5cGVkZWYgc3RydWN0IGJvb3Rfc2VjdG9yIHsKKwlfX3U4CWlnbm9yZWRbM107CS8qIEJvb3RzdHJhcCBjb2RlICovCisJY2hhcglzeXN0ZW1faWRbOF07CS8qIE5hbWUgb2YgZnMgKi8KKwlfX3U4CXNlY3Rvcl9zaXplWzJdOwkvKiBCeXRlcy9zZWN0b3IgKi8KKwlfX3U4CWNsdXN0ZXJfc2l6ZTsJLyogU2VjdG9ycy9jbHVzdGVyICovCisJX191MTYJcmVzZXJ2ZWQ7CS8qIE51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzICovCisJX191OAlmYXRzOwkJLyogTnVtYmVyIG9mIEZBVHMgKi8KKwlfX3U4CWRpcl9lbnRyaWVzWzJdOwkvKiBOdW1iZXIgb2Ygcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCV9fdTgJc2VjdG9yc1syXTsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKi8KKwlfX3U4CW1lZGlhOwkJLyogTWVkaWEgY29kZSAqLworCV9fdTE2CWZhdF9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCisJX191MTYJc2Vjc190cmFjazsJLyogU2VjdG9ycy90cmFjayAqLworCV9fdTE2CWhlYWRzOwkJLyogTnVtYmVyIG9mIGhlYWRzICovCisJX191MzIJaGlkZGVuOwkJLyogTnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzICovCisJX191MzIJdG90YWxfc2VjdDsJLyogTnVtYmVyIG9mIHNlY3RvcnMgKGlmIHNlY3RvcnMgPT0gMCkgKi8KKworCS8qIEZBVDMyIG9ubHkgKi8KKwlfX3UzMglmYXQzMl9sZW5ndGg7CS8qIFNlY3RvcnMvRkFUICovCisJX191MTYJZmxhZ3M7CQkvKiBCaXQgODogZmF0IG1pcnJvcmluZywgbG93IDQ6IGFjdGl2ZSBmYXQgKi8KKwlfX3U4CXZlcnNpb25bMl07CS8qIEZpbGVzeXN0ZW0gdmVyc2lvbiAqLworCV9fdTMyCXJvb3RfY2x1c3RlcjsJLyogRmlyc3QgY2x1c3RlciBpbiByb290IGRpcmVjdG9yeSAqLworCV9fdTE2CWluZm9fc2VjdG9yOwkvKiBGaWxlc3lzdGVtIGluZm8gc2VjdG9yICovCisJX191MTYJYmFja3VwX2Jvb3Q7CS8qIEJhY2t1cCBib290IHNlY3RvciAqLworCV9fdTE2CXJlc2VydmVkMls2XTsJLyogVW51c2VkICovCit9IGJvb3Rfc2VjdG9yOworCit0eXBlZGVmIHN0cnVjdCB2b2x1bWVfaW5mbworeworCV9fdTggZHJpdmVfbnVtYmVyOwkvKiBCSU9TIGRyaXZlIG51bWJlciAqLworCV9fdTggcmVzZXJ2ZWQ7CQkvKiBVbnVzZWQgKi8KKwlfX3U4IGV4dF9ib290X3NpZ247CS8qIDB4MjkgaWYgZmllbGRzIGJlbG93IGV4aXN0IChET1MgMy4zKykgKi8KKwlfX3U4IHZvbHVtZV9pZFs0XTsJLyogVm9sdW1lIElEIG51bWJlciAqLworCWNoYXIgdm9sdW1lX2xhYmVsWzExXTsJLyogVm9sdW1lIGxhYmVsICovCisJY2hhciBmc190eXBlWzhdOwkvKiBUeXBpY2FsbHkgRkFUMTIsIEZBVDE2LCBvciBGQVQzMiAqLworCS8qIEJvb3QgY29kZSBjb21lcyBuZXh0LCBhbGwgYnV0IDIgYnl0ZXMgdG8gZmlsbCB1cCBzZWN0b3IgKi8KKwkvKiBCb290IHNpZ24gY29tZXMgbGFzdCwgMiBieXRlcyAqLworfSB2b2x1bWVfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX2VudHJ5IHsKKwljaGFyCW5hbWVbOF0sZXh0WzNdOwkvKiBOYW1lIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWF0dHI7CQkvKiBBdHRyaWJ1dGUgYml0cyAqLworCV9fdTgJbGNhc2U7CQkvKiBDYXNlIGZvciBiYXNlIGFuZCBleHRlbnNpb24gKi8KKwlfX3U4CWN0aW1lX21zOwkvKiBDcmVhdGlvbiB0aW1lLCBtaWxsaXNlY29uZHMgKi8KKwlfX3UxNgljdGltZTsJCS8qIENyZWF0aW9uIHRpbWUgKi8KKwlfX3UxNgljZGF0ZTsJCS8qIENyZWF0aW9uIGRhdGUgKi8KKwlfX3UxNglhZGF0ZTsJCS8qIExhc3QgYWNjZXNzIGRhdGUgKi8KKwlfX3UxNglzdGFydGhpOwkvKiBIaWdoIDE2IGJpdHMgb2YgY2x1c3RlciBpbiBGQVQzMiAqLworCV9fdTE2CXRpbWUsZGF0ZSxzdGFydDsvKiBUaW1lLCBkYXRlIGFuZCBmaXJzdCBjbHVzdGVyICovCisJX191MzIJc2l6ZTsJCS8qIEZpbGUgc2l6ZSBpbiBieXRlcyAqLworfSBkaXJfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IGRpcl9zbG90IHsKKwlfX3U4ICAgIGlkOwkJLyogU2VxdWVuY2UgbnVtYmVyIGZvciBzbG90ICovCisJX191OCAgICBuYW1lMF80WzEwXTsJLyogRmlyc3QgNSBjaGFyYWN0ZXJzIGluIG5hbWUgKi8KKwlfX3U4ICAgIGF0dHI7CQkvKiBBdHRyaWJ1dGUgYnl0ZSAqLworCV9fdTggICAgcmVzZXJ2ZWQ7CS8qIFVudXNlZCAqLworCV9fdTggICAgYWxpYXNfY2hlY2tzdW07LyogQ2hlY2tzdW0gZm9yIDguMyBhbGlhcyAqLworCV9fdTggICAgbmFtZTVfMTBbMTJdOwkvKiA2IG1vcmUgY2hhcmFjdGVycyBpbiBuYW1lICovCisJX191MTYgICBzdGFydDsJCS8qIFVudXNlZCAqLworCV9fdTggICAgbmFtZTExXzEyWzRdOwkvKiBMYXN0IDIgY2hhcmFjdGVycyBpbiBuYW1lICovCit9IGRpcl9zbG90OworCisvKiBQcml2YXRlIGZpbGVzeXN0ZW0gcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlmYXRzaXplOwkvKiBTaXplIG9mIEZBVCBpbiBiaXRzICovCisJX191MTYJZmF0bGVuZ3RoOwkvKiBMZW5ndGggb2YgRkFUIGluIHNlY3RvcnMgKi8KKwlfX3UxNglmYXRfc2VjdDsJLyogU3RhcnRpbmcgc2VjdG9yIG9mIHRoZSBGQVQgKi8KKwlfX3UxNglyb290ZGlyX3NlY3Q7CS8qIFN0YXJ0IHNlY3RvciBvZiByb290IGRpcmVjdG9yeSAqLworCV9fdTE2CWNsdXN0X3NpemU7CS8qIFNpemUgb2YgY2x1c3RlcnMgaW4gc2VjdG9ycyAqLworCXNob3J0CWRhdGFfYmVnaW47CS8qIFRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0IGNsdXN0ZXIsIGNhbiBiZSBuZWdhdGl2ZSAqLworCV9fdTMyCWZhdGJ1ZltGQVRCVUZTSVpFXTsgLyogQ3VycmVudCBGQVQgYnVmZmVyICovCisJaW50CWZhdGJ1Zm51bTsJLyogVXNlZCBieSBnZXRfZmF0ZW50LCBpbml0IHRvIC0xICovCit9IGZzZGF0YTsKKwordHlwZWRlZiBpbnQJKGZpbGVfZGV0ZWN0ZnNfZnVuYykodm9pZCk7Cit0eXBlZGVmIGludAkoZmlsZV9sc19mdW5jKShjb25zdCBjaGFyICpkaXIpOwordHlwZWRlZiBsb25nCShmaWxlX3JlYWRfZnVuYykoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJCQkgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKKworc3RydWN0IGZpbGVzeXN0ZW0geworCWZpbGVfZGV0ZWN0ZnNfZnVuYyAqZGV0ZWN0OworCWZpbGVfbHNfZnVuYwkgICAqbHM7CisJZmlsZV9yZWFkX2Z1bmMJICAgKnJlYWQ7CisJY29uc3QgY2hhcgkgICAgbmFtZVsxMl07Cit9OworCisvKiBGQVQgdGFibGVzICovCitmaWxlX2RldGVjdGZzX2Z1bmMJZmlsZV9mYXRfZGV0ZWN0ZnM7CitmaWxlX2xzX2Z1bmMJCWZpbGVfZmF0X2xzOworZmlsZV9yZWFkX2Z1bmMJCWZpbGVfZmF0X3JlYWQ7CisKKy8qIEN1cnJlbnRseSB0aGlzIGRvZXNuJ3QgY2hlY2sgaWYgdGhlIGRpciBleGlzdHMgb3IgaXMgdmFsaWQuLi4gKi8KK2ludCBmaWxlX2NkKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IGZpbGVfZmF0X2RldGVjdGZzKHZvaWQpOworaW50IGZpbGVfZmF0X2xzKGNvbnN0IGNoYXIgKmRpcik7Citsb25nIGZpbGVfZmF0X3JlYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBtYXhzaXplKTsKK2NvbnN0IGNoYXIgKmZpbGVfZ2V0ZnNuYW1lKGludCBpZHgpOworaW50IGZhdF9yZWdpc3Rlcl9kZXZpY2UoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MsIGludCBwYXJ0X25vKTsKKworI2VuZGlmIC8qIF9GQVRfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvaWRlLmggYi94LWxvYWRlci9pbmNsdWRlL2lkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWYzMmYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2lkZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZglfSURFX0gKKyNkZWZpbmUgX0lERV9ICisKKyNkZWZpbmUJSURFX0JVUyhkZXYpCShkZXYgPj4gMSkKKworI2lmZGVmIENPTkZJR19JREVfTEVECisKKy8qCisgKiBMRUQgUG9ydAorICovCisjZGVmaW5lCUxFRF9QT1JUCSgodWNoYXIgKikoUEVSOF9CQVNFICsgMHgzMDAwKSkKKyNkZWZpbmUgTEVEX0lERTEJMHgwMQorI2RlZmluZSBMRURfSURFMgkweDAyCisjZGVmaW5lCURFVklDRV9MRUQoZCkJKChkICYgMikgfCAoKGQgJiAyKSA9PSAwKSkgLyogZGVwZW5kcyBvbiBiaXQgcG9zaXRpb25zISAqLworCisjZW5kaWYgLyogQ09ORklHX0lERV9MRUQgKi8KKworI2lmZGVmIENGR182NEJJVF9MQkEKK3R5cGVkZWYgdWludDY0X3QgbGJhaW50X3Q7CisjZWxzZQordHlwZWRlZiB1bG9uZyBsYmFpbnRfdDsKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gUHJvdG90eXBlcworICovCisKK3ZvaWQgIGlkZV9pbml0ICAodm9pZCk7Cit1bG9uZyBpZGVfcmVhZAkoaW50IGRldmljZSwgbGJhaW50X3QgYmxrbnIsIHVsb25nIGJsa2NudCwgdWxvbmcgKmJ1ZmZlcik7Cit1bG9uZyBpZGVfd3JpdGUgKGludCBkZXZpY2UsIGxiYWludF90IGJsa25yLCB1bG9uZyBibGtjbnQsIHVsb25nICpidWZmZXIpOworCisjZW5kaWYgLyogX0lERV9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2ltYWdlLmggYi94LWxvYWRlci9pbmNsdWRlL2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3OGU5MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvaW1hZ2UuaApAQCAtMCwwICsxLDY3OSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwOCBTZW1paGFsZgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA1CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTk9URTogVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIGFuIGludGVyZmFjZSB0byBVLUJvb3QuIEluY2x1ZGluZworICogdGhpcyAodW5tb2RpZmllZCkgaGVhZGVyIGZpbGUgaW4gYW5vdGhlciBmaWxlIGlzIGNvbnNpZGVyZWQgbm9ybWFsCisgKiB1c2Ugb2YgVS1Cb290LCBhbmQgZG9lcyAqbm90KiBmYWxsIHVuZGVyIHRoZSBoZWFkaW5nIG9mICJkZXJpdmVkCisgKiB3b3JrIi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX19JTUFHRV9IX18KKyNkZWZpbmUgX19JTUFHRV9IX18KKworI2luY2x1ZGUgImNvbXBpbGVyLmgiCisKKyNpZmRlZiBVU0VfSE9TVENDCisKKy8qIG5ldyB1SW1hZ2UgZm9ybWF0IHN1cHBvcnQgZW5hYmxlZCBvbiBob3N0ICovCisjZGVmaW5lIENPTkZJR19GSVQJCTEKKyNkZWZpbmUgQ09ORklHX09GX0xJQkZEVAkxCisjZGVmaW5lIENPTkZJR19GSVRfVkVSQk9TRQkxIC8qIGVuYWJsZSBmaXRfZm9ybWF0X3tlcnJvcix3YXJuaW5nfSgpICovCisKKyNlbHNlCisKKyNpbmNsdWRlIDxjb21tYW5kLmg+CisKKyNlbmRpZiAvKiBVU0VfSE9TVENDICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19GSVQpCisjaW5jbHVkZSA8ZmR0Lmg+CisjaW5jbHVkZSA8bGliZmR0Lmg+CisjaW5jbHVkZSA8ZmR0X3N1cHBvcnQuaD4KKyNkZWZpbmUgQ09ORklHX01ENQkJLyogRklUIGltYWdlcyBuZWVkIE1ENSBzdXBwb3J0ICovCisjZGVmaW5lIENPTkZJR19TSEExCQkvKiBhbmQgU0hBMSAqLworI2VuZGlmCisKKy8qCisgKiBPcGVyYXRpbmcgU3lzdGVtIENvZGVzCisgKi8KKyNkZWZpbmUgSUhfT1NfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIE9TCSovCisjZGVmaW5lIElIX09TX09QRU5CU0QJCTEJLyogT3BlbkJTRAkqLworI2RlZmluZSBJSF9PU19ORVRCU0QJCTIJLyogTmV0QlNECSovCisjZGVmaW5lIElIX09TX0ZSRUVCU0QJCTMJLyogRnJlZUJTRAkqLworI2RlZmluZSBJSF9PU180XzRCU0QJCTQJLyogNC40QlNECSovCisjZGVmaW5lIElIX09TX0xJTlVYCQk1CS8qIExpbnV4CSovCisjZGVmaW5lIElIX09TX1NWUjQJCTYJLyogU1ZSNAkJKi8KKyNkZWZpbmUgSUhfT1NfRVNJWAkJNwkvKiBFc2l4CQkqLworI2RlZmluZSBJSF9PU19TT0xBUklTCQk4CS8qIFNvbGFyaXMJKi8KKyNkZWZpbmUgSUhfT1NfSVJJWAkJOQkvKiBJcml4CQkqLworI2RlZmluZSBJSF9PU19TQ08JCTEwCS8qIFNDTwkJKi8KKyNkZWZpbmUgSUhfT1NfREVMTAkJMTEJLyogRGVsbAkJKi8KKyNkZWZpbmUgSUhfT1NfTkNSCQkxMgkvKiBOQ1IJCSovCisjZGVmaW5lIElIX09TX0xZTlhPUwkJMTMJLyogTHlueE9TCSovCisjZGVmaW5lIElIX09TX1ZYV09SS1MJCTE0CS8qIFZ4V29ya3MJKi8KKyNkZWZpbmUgSUhfT1NfUFNPUwkJMTUJLyogcFNPUwkJKi8KKyNkZWZpbmUgSUhfT1NfUU5YCQkxNgkvKiBRTlgJCSovCisjZGVmaW5lIElIX09TX1VfQk9PVAkJMTcJLyogRmlybXdhcmUJKi8KKyNkZWZpbmUgSUhfT1NfUlRFTVMJCTE4CS8qIFJURU1TCSovCisjZGVmaW5lIElIX09TX0FSVE9TCQkxOQkvKiBBUlRPUwkqLworI2RlZmluZSBJSF9PU19VTklUWQkJMjAJLyogVW5pdHkgT1MJKi8KKyNkZWZpbmUgSUhfT1NfSU5URUdSSVRZCQkyMQkvKiBJTlRFR1JJVFkJKi8KKworLyoKKyAqIENQVSBBcmNoaXRlY3R1cmUgQ29kZXMgKHN1cHBvcnRlZCBieSBMaW51eCkKKyAqLworI2RlZmluZSBJSF9BUkNIX0lOVkFMSUQJCTAJLyogSW52YWxpZCBDUFUJKi8KKyNkZWZpbmUgSUhfQVJDSF9BTFBIQQkJMQkvKiBBbHBoYQkqLworI2RlZmluZSBJSF9BUkNIX0FSTQkJMgkvKiBBUk0JCSovCisjZGVmaW5lIElIX0FSQ0hfSTM4NgkJMwkvKiBJbnRlbCB4ODYJKi8KKyNkZWZpbmUgSUhfQVJDSF9JQTY0CQk0CS8qIElBNjQJCSovCisjZGVmaW5lIElIX0FSQ0hfTUlQUwkJNQkvKiBNSVBTCQkqLworI2RlZmluZSBJSF9BUkNIX01JUFM2NAkJNgkvKiBNSVBTCSA2NCBCaXQgKi8KKyNkZWZpbmUgSUhfQVJDSF9QUEMJCTcJLyogUG93ZXJQQwkqLworI2RlZmluZSBJSF9BUkNIX1MzOTAJCTgJLyogSUJNIFMzOTAJKi8KKyNkZWZpbmUgSUhfQVJDSF9TSAkJOQkvKiBTdXBlckgJKi8KKyNkZWZpbmUgSUhfQVJDSF9TUEFSQwkJMTAJLyogU3BhcmMJKi8KKyNkZWZpbmUgSUhfQVJDSF9TUEFSQzY0CQkxMQkvKiBTcGFyYyA2NCBCaXQgKi8KKyNkZWZpbmUgSUhfQVJDSF9NNjhLCQkxMgkvKiBNNjhLCQkqLworI2RlZmluZSBJSF9BUkNIX01JQ1JPQkxBWkUJMTQJLyogTWljcm9CbGF6ZSAgICovCisjZGVmaW5lIElIX0FSQ0hfTklPUzIJCTE1CS8qIE5pb3MtSUkJKi8KKyNkZWZpbmUgSUhfQVJDSF9CTEFDS0ZJTgkxNgkvKiBCbGFja2ZpbgkqLworI2RlZmluZSBJSF9BUkNIX0FWUjMyCQkxNwkvKiBBVlIzMgkqLworI2RlZmluZSBJSF9BUkNIX1NUMjAwCSAgICAgICAgMTgJLyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUMjAwICAqLworCisvKgorICogSW1hZ2UgVHlwZXMKKyAqCisgKiAiU3RhbmRhbG9uZSBQcm9ncmFtcyIgYXJlIGRpcmVjdGx5IHJ1bm5hYmxlIGluIHRoZSBlbnZpcm9ubWVudAorICoJcHJvdmlkZWQgYnkgVS1Cb290OyBpdCBpcyBleHBlY3RlZCB0aGF0IChpZiB0aGV5IGJlaGF2ZQorICoJd2VsbCkgeW91IGNhbiBjb250aW51ZSB0byB3b3JrIGluIFUtQm9vdCBhZnRlciByZXR1cm4gZnJvbQorICoJdGhlIFN0YW5kYWxvbmUgUHJvZ3JhbS4KKyAqICJPUyBLZXJuZWwgSW1hZ2VzIiBhcmUgdXN1YWxseSBpbWFnZXMgb2Ygc29tZSBFbWJlZGRlZCBPUyB3aGljaAorICoJd2lsbCB0YWtlIG92ZXIgY29udHJvbCBjb21wbGV0ZWx5LiBVc3VhbGx5IHRoZXNlIHByb2dyYW1zCisgKgl3aWxsIGluc3RhbGwgdGhlaXIgb3duIHNldCBvZiBleGNlcHRpb24gaGFuZGxlcnMsIGRldmljZQorICoJZHJpdmVycywgc2V0IHVwIHRoZSBNTVUsIGV0Yy4gLSB0aGlzIG1lYW5zLCB0aGF0IHlvdSBjYW5ub3QKKyAqCWV4cGVjdCB0byByZS1lbnRlciBVLUJvb3QgZXhjZXB0IGJ5IHJlc2V0dGluZyB0aGUgQ1BVLgorICogIlJBTURpc2sgSW1hZ2VzIiBhcmUgbW9yZSBvciBsZXNzIGp1c3QgZGF0YSBibG9ja3MsIGFuZCB0aGVpcgorICoJcGFyYW1ldGVycyAoYWRkcmVzcywgc2l6ZSkgYXJlIHBhc3NlZCB0byBhbiBPUyBrZXJuZWwgdGhhdCBpcworICoJYmVpbmcgc3RhcnRlZC4KKyAqICJNdWx0aS1GaWxlIEltYWdlcyIgY29udGFpbiBzZXZlcmFsIGltYWdlcywgdHlwaWNhbGx5IGFuIE9TCisgKgkoTGludXgpIGtlcm5lbCBpbWFnZSBhbmQgb25lIG9yIG1vcmUgZGF0YSBpbWFnZXMgbGlrZQorICoJUkFNRGlza3MuIFRoaXMgY29uc3RydWN0IGlzIHVzZWZ1bCBmb3IgaW5zdGFuY2Ugd2hlbiB5b3Ugd2FudAorICoJdG8gYm9vdCBvdmVyIHRoZSBuZXR3b3JrIHVzaW5nIEJPT1RQIGV0Yy4sIHdoZXJlIHRoZSBib290CisgKglzZXJ2ZXIgcHJvdmlkZXMganVzdCBhIHNpbmdsZSBpbWFnZSBmaWxlLCBidXQgeW91IHdhbnQgdG8gZ2V0CisgKglmb3IgaW5zdGFuY2UgYW4gT1Mga2VybmVsIGFuZCBhIFJBTURpc2sgaW1hZ2UuCisgKgorICoJIk11bHRpLUZpbGUgSW1hZ2VzIiBzdGFydCB3aXRoIGEgbGlzdCBvZiBpbWFnZSBzaXplcywgZWFjaAorICoJaW1hZ2Ugc2l6ZSAoaW4gYnl0ZXMpIHNwZWNpZmllZCBieSBhbiAidWludDMyX3QiIGluIG5ldHdvcmsKKyAqCWJ5dGUgb3JkZXIuIFRoaXMgbGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IGFuICIodWludDMyX3QpMCIuCisgKglJbW1lZGlhdGVseSBhZnRlciB0aGUgdGVybWluYXRpbmcgMCBmb2xsb3cgdGhlIGltYWdlcywgb25lIGJ5CisgKglvbmUsIGFsbCBhbGlnbmVkIG9uICJ1aW50MzJfdCIgYm91bmRhcmllcyAoc2l6ZSByb3VuZGVkIHVwIHRvCisgKglhIG11bHRpcGxlIG9mIDQgYnl0ZXMgLSBleGNlcHQgZm9yIHRoZSBsYXN0IGZpbGUpLgorICoKKyAqICJGaXJtd2FyZSBJbWFnZXMiIGFyZSBiaW5hcnkgaW1hZ2VzIGNvbnRhaW5pbmcgZmlybXdhcmUgKGxpa2UKKyAqCVUtQm9vdCBvciBGUEdBIGltYWdlcykgd2hpY2ggdXN1YWxseSB3aWxsIGJlIHByb2dyYW1tZWQgdG8KKyAqCWZsYXNoIG1lbW9yeS4KKyAqCisgKiAiU2NyaXB0IGZpbGVzIiBhcmUgY29tbWFuZCBzZXF1ZW5jZXMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJ5CisgKglVLUJvb3QncyBjb21tYW5kIGludGVycHJldGVyOyB0aGlzIGZlYXR1cmUgaXMgZXNwZWNpYWxseQorICoJdXNlZnVsIHdoZW4geW91IGNvbmZpZ3VyZSBVLUJvb3QgdG8gdXNlIGEgcmVhbCBzaGVsbCAoaHVzaCkKKyAqCWFzIGNvbW1hbmQgaW50ZXJwcmV0ZXIgKD0+IFNoZWxsIFNjcmlwdHMpLgorICovCisKKyNkZWZpbmUgSUhfVFlQRV9JTlZBTElECQkwCS8qIEludmFsaWQgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfU1RBTkRBTE9ORQkxCS8qIFN0YW5kYWxvbmUgUHJvZ3JhbQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9LRVJORUwJCTIJLyogT1MgS2VybmVsIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX1JBTURJU0sJCTMJLyogUkFNRGlzayBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9NVUxUSQkJNAkvKiBNdWx0aS1GaWxlIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX0ZJUk1XQVJFCTUJLyogRmlybXdhcmUgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfU0NSSVBUCQk2CS8qIFNjcmlwdCBmaWxlCQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GSUxFU1lTVEVNCTcJLyogRmlsZXN5c3RlbSBJbWFnZSAoYW55IHR5cGUpCSovCisjZGVmaW5lIElIX1RZUEVfRkxBVERUCQk4CS8qIEJpbmFyeSBGbGF0IERldmljZSBUcmVlIEJsb2IJKi8KKyNkZWZpbmUgSUhfVFlQRV9LV0JJTUFHRQk5CS8qIEtpcmt3b29kIEJvb3QgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfSU1YSU1BR0UJMTAJLyogRnJlZXNjYWxlIElNWEJvb3QgSW1hZ2UJKi8KKworLyoKKyAqIENvbXByZXNzaW9uIFR5cGVzCisgKi8KKyNkZWZpbmUgSUhfQ09NUF9OT05FCQkwCS8qICBObwkgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0daSVAJCTEJLyogZ3ppcAkgQ29tcHJlc3Npb24gVXNlZAkqLworI2RlZmluZSBJSF9DT01QX0JaSVAyCQkyCS8qIGJ6aXAyIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9MWk1BCQkzCS8qIGx6bWEgIENvbXByZXNzaW9uIFVzZWQJKi8KKyNkZWZpbmUgSUhfQ09NUF9MWk8JCTQJLyogbHpvICAgQ29tcHJlc3Npb24gVXNlZAkqLworCisjZGVmaW5lIElIX01BR0lDCTB4MjcwNTE5NTYJLyogSW1hZ2UgTWFnaWMgTnVtYmVyCQkqLworI2RlZmluZSBJSF9OTUxFTgkJMzIJLyogSW1hZ2UgTmFtZSBMZW5ndGgJCSovCisKKy8qCisgKiBMZWdhY3kgZm9ybWF0IGltYWdlIGhlYWRlciwKKyAqIGFsbCBkYXRhIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYWthIG5hdHVyYWwgYWthIGJpZ2VuZGlhbikuCisgKi8KK3R5cGVkZWYgc3RydWN0IGltYWdlX2hlYWRlciB7CisJdWludDMyX3QJaWhfbWFnaWM7CS8qIEltYWdlIEhlYWRlciBNYWdpYyBOdW1iZXIJKi8KKwl1aW50MzJfdAlpaF9oY3JjOwkvKiBJbWFnZSBIZWFkZXIgQ1JDIENoZWNrc3VtCSovCisJdWludDMyX3QJaWhfdGltZTsJLyogSW1hZ2UgQ3JlYXRpb24gVGltZXN0YW1wCSovCisJdWludDMyX3QJaWhfc2l6ZTsJLyogSW1hZ2UgRGF0YSBTaXplCQkqLworCXVpbnQzMl90CWloX2xvYWQ7CS8qIERhdGEJIExvYWQgIEFkZHJlc3MJCSovCisJdWludDMyX3QJaWhfZXA7CQkvKiBFbnRyeSBQb2ludCBBZGRyZXNzCQkqLworCXVpbnQzMl90CWloX2RjcmM7CS8qIEltYWdlIERhdGEgQ1JDIENoZWNrc3VtCSovCisJdWludDhfdAkJaWhfb3M7CQkvKiBPcGVyYXRpbmcgU3lzdGVtCQkqLworCXVpbnQ4X3QJCWloX2FyY2g7CS8qIENQVSBhcmNoaXRlY3R1cmUJCSovCisJdWludDhfdAkJaWhfdHlwZTsJLyogSW1hZ2UgVHlwZQkJCSovCisJdWludDhfdAkJaWhfY29tcDsJLyogQ29tcHJlc3Npb24gVHlwZQkJKi8KKwl1aW50OF90CQlpaF9uYW1lW0lIX05NTEVOXTsJLyogSW1hZ2UgTmFtZQkJKi8KK30gaW1hZ2VfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGltYWdlX2luZm8geworCXVsb25nCQlzdGFydCwgZW5kOwkJLyogc3RhcnQvZW5kIG9mIGJsb2IgKi8KKwl1bG9uZwkJaW1hZ2Vfc3RhcnQsIGltYWdlX2xlbjsgLyogc3RhcnQgb2YgaW1hZ2Ugd2l0aGluIGJsb2IsIGxlbiBvZiBpbWFnZSAqLworCXVsb25nCQlsb2FkOwkJCS8qIGxvYWQgYWRkciBmb3IgdGhlIGltYWdlICovCisJdWludDhfdAkJY29tcCwgdHlwZSwgb3M7CQkvKiBjb21wcmVzc2lvbiwgdHlwZSBvZiBpbWFnZSwgb3MgdHlwZSAqLworfSBpbWFnZV9pbmZvX3Q7CisKKy8qCisgKiBMZWdhY3kgYW5kIEZJVCBmb3JtYXQgaGVhZGVycyB1c2VkIGJ5IGRvX2Jvb3RtKCkgYW5kIGRvX2Jvb3RtXzxvcz4oKQorICogcm91dGluZXMuCisgKi8KK3N0cnVjdCBiZDsKKwordHlwZWRlZiBzdHJ1Y3QgYm9vdG1faGVhZGVycyB7CisJLyoKKwkgKiBMZWdhY3kgb3MgaW1hZ2UgaGVhZGVyLCBpZiBpdCBpcyBhIG11bHRpIGNvbXBvbmVudCBpbWFnZQorCSAqIHRoZW4gYm9vdF9nZXRfcmFtZGlzaygpIGFuZCBnZXRfZmR0KCkgd2lsbCBhdHRlbXB0IHRvIGdldAorCSAqIGRhdGEgZnJvbSBzZWNvbmQgYW5kIHRoaXJkIGNvbXBvbmVudCBhY2NvcmRpbmdseS4KKwkgKi8KKwlpbWFnZV9oZWFkZXJfdAkqbGVnYWN5X2hkcl9vczsJCS8qIGltYWdlIGhlYWRlciBwb2ludGVyICovCisJaW1hZ2VfaGVhZGVyX3QJbGVnYWN5X2hkcl9vc19jb3B5OwkvKiBoZWFkZXIgY29weSAqLworCXVsb25nCQlsZWdhY3lfaGRyX3ZhbGlkOworCisjaWYgZGVmaW5lZChDT05GSUdfRklUKQorCWNvbnN0IGNoYXIJKmZpdF91bmFtZV9jZmc7CS8qIGNvbmZpZ3VyYXRpb24gbm9kZSB1bml0IG5hbWUgKi8KKworCXZvaWQJCSpmaXRfaGRyX29zOwkvKiBvcyBGSVQgaW1hZ2UgaGVhZGVyICovCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX29zOwkvKiBvcyBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfb3M7CS8qIG9zIHN1YmltYWdlIG5vZGUgb2Zmc2V0ICovCisKKwl2b2lkCQkqZml0X2hkcl9yZDsJLyogaW5pdCByYW1kaXNrIEZJVCBpbWFnZSBoZWFkZXIgKi8KKwljb25zdCBjaGFyCSpmaXRfdW5hbWVfcmQ7CS8qIGluaXQgcmFtZGlzayBzdWJpbWFnZSBub2RlIHVuaXQgbmFtZSAqLworCWludAkJZml0X25vZmZzZXRfcmQ7CS8qIGluaXQgcmFtZGlzayBzdWJpbWFnZSBub2RlIG9mZnNldCAqLworCisJdm9pZAkJKmZpdF9oZHJfZmR0OwkvKiBGRFQgYmxvYiBGSVQgaW1hZ2UgaGVhZGVyICovCisJY29uc3QgY2hhcgkqZml0X3VuYW1lX2ZkdDsJLyogRkRUIGJsb2Igc3ViaW1hZ2Ugbm9kZSB1bml0IG5hbWUgKi8KKwlpbnQJCWZpdF9ub2Zmc2V0X2ZkdDsvKiBGRFQgYmxvYiBzdWJpbWFnZSBub2RlIG9mZnNldCAqLworI2VuZGlmCisKKyNpZm5kZWYgVVNFX0hPU1RDQworCWltYWdlX2luZm9fdAlvczsJCS8qIG9zIGltYWdlIGluZm8gKi8KKwl1bG9uZwkJZXA7CQkvKiBlbnRyeSBwb2ludCBvZiBPUyAqLworCisJdWxvbmcJCXJkX3N0YXJ0LCByZF9lbmQ7LyogcmFtZGlzayBzdGFydC9lbmQgKi8KKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKKwljaGFyCQkqZnRfYWRkcjsJLyogZmxhdCBkZXYgdHJlZSBhZGRyZXNzICovCisjZW5kaWYKKwl1bG9uZwkJZnRfbGVuOwkJLyogbGVuZ3RoIG9mIGZsYXQgZGV2aWNlIHRyZWUgKi8KKworCXVsb25nCQlpbml0cmRfc3RhcnQ7CisJdWxvbmcJCWluaXRyZF9lbmQ7CisJdWxvbmcJCWNtZGxpbmVfc3RhcnQ7CisJdWxvbmcJCWNtZGxpbmVfZW5kOworCXN0cnVjdCBiZAkqa2JkOworI2VuZGlmCisKKwlpbnQJCXZlcmlmeTsJCS8qIGdldGVudigidmVyaWZ5IilbMF0gIT0gJ24nICovCisKKyNkZWZpbmUJQk9PVE1fU1RBVEVfU1RBUlQJKDB4MDAwMDAwMDEpCisjZGVmaW5lCUJPT1RNX1NUQVRFX0xPQURPUwkoMHgwMDAwMDAwMikKKyNkZWZpbmUJQk9PVE1fU1RBVEVfUkFNRElTSwkoMHgwMDAwMDAwNCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfRkRUCQkoMHgwMDAwMDAwOCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfQ01ETElORQkoMHgwMDAwMDAxMCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfQkRfVAkoMHgwMDAwMDAyMCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfUFJFUAkoMHgwMDAwMDA0MCkKKyNkZWZpbmUJQk9PVE1fU1RBVEVfT1NfR08JKDB4MDAwMDAwODApCisJaW50CQlzdGF0ZTsKKworI2lmZGVmIENPTkZJR19MTUIKKwlzdHJ1Y3QgbG1iCWxtYjsJCS8qIGZvciBtZW1vcnkgbWdtdCAqLworI2VuZGlmCit9IGJvb3RtX2hlYWRlcnNfdDsKKworLyoKKyAqIFNvbWUgc3lzdGVtcyAoZm9yIGV4YW1wbGUgTFdNT04pIGhhdmUgdmVyeSBzaG9ydCB3YXRjaGRvZyBwZXJpb2RzOworICogd2UgbXVzdCBtYWtlIHN1cmUgdG8gc3BsaXQgbG9uZyBvcGVyYXRpb25zIGxpa2UgbWVtbW92ZSgpIG9yCisgKiBjaGVja3N1bSBjYWxjdWxhdGlvbnMgaW50byByZWFzb25hYmxlIGNodW5rcy4KKyAqLworI2lmbmRlZiBDSFVOS1NaCisjZGVmaW5lIENIVU5LU1ogKDY0ICogMTAyNCkKKyNlbmRpZgorCisjaWZuZGVmIENIVU5LU1pfQ1JDMzIKKyNkZWZpbmUgQ0hVTktTWl9DUkMzMiAoNjQgKiAxMDI0KQorI2VuZGlmCisKKyNpZm5kZWYgQ0hVTktTWl9NRDUKKyNkZWZpbmUgQ0hVTktTWl9NRDUgKDY0ICogMTAyNCkKKyNlbmRpZgorCisjaWZuZGVmIENIVU5LU1pfU0hBMQorI2RlZmluZSBDSFVOS1NaX1NIQTEgKDY0ICogMTAyNCkKKyNlbmRpZgorCisjZGVmaW5lIHVpbWFnZV90b19jcHUoeCkJCWJlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGNwdV90b191aW1hZ2UoeCkJCWNwdV90b19iZTMyKHgpCisKKy8qCisgKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3IgZW50cmllcyBvZiBhIHNwZWNpZmljIHR5cGU7IHVzZWQgYnkKKyAqIGdldF90YWJsZV9lbnRyeV9pZCgpIGFuZCBnZXRfdGFibGVfZW50cnlfbmFtZSgpLgorICovCit0eXBlZGVmIHN0cnVjdCB0YWJsZV9lbnRyeSB7CisJaW50CWlkOworCWNoYXIJKnNuYW1lOwkJLyogc2hvcnQgKGlucHV0KSBuYW1lIHRvIGZpbmQgdGFibGUgZW50cnkgKi8KKwljaGFyCSpsbmFtZTsJCS8qIGxvbmcgKG91dHB1dCkgbmFtZSB0byBwcmludCBmb3IgbWVzc2FnZXMgKi8KK30gdGFibGVfZW50cnlfdDsKKworLyoKKyAqIGdldF90YWJsZV9lbnRyeV9pZCgpIHNjYW5zIHRoZSB0cmFuc2xhdGlvbiB0YWJsZSB0cnlpbmcgdG8gZmluZCBhbgorICogZW50cnkgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzaG9ydCBuYW1lLiBJZiBhIG1hdGNoaW5nIGVudHJ5IGlzCisgKiBmb3VuZCwgaXQncyBpZCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICovCitpbnQgZ2V0X3RhYmxlX2VudHJ5X2lkICh0YWJsZV9lbnRyeV90ICp0YWJsZSwKKwkJY29uc3QgY2hhciAqdGFibGVfbmFtZSwgY29uc3QgY2hhciAqbmFtZSk7CisvKgorICogZ2V0X3RhYmxlX2VudHJ5X25hbWUoKSBzY2FucyB0aGUgdHJhbnNsYXRpb24gdGFibGUgdHJ5aW5nIHRvIGZpbmQKKyAqIGFuIGVudHJ5IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaWQuIElmIGEgbWF0Y2hpbmcgZW50cnkgaXMgZm91bmQsCisgKiBpdHMgbG9uZyBuYW1lIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisgKi8KK2NoYXIgKmdldF90YWJsZV9lbnRyeV9uYW1lICh0YWJsZV9lbnRyeV90ICp0YWJsZSwgY2hhciAqbXNnLCBpbnQgaWQpOworCitjb25zdCBjaGFyICpnZW5pbWdfZ2V0X29zX25hbWUgKHVpbnQ4X3Qgb3MpOworY29uc3QgY2hhciAqZ2VuaW1nX2dldF9hcmNoX25hbWUgKHVpbnQ4X3QgYXJjaCk7Citjb25zdCBjaGFyICpnZW5pbWdfZ2V0X3R5cGVfbmFtZSAodWludDhfdCB0eXBlKTsKK2NvbnN0IGNoYXIgKmdlbmltZ19nZXRfY29tcF9uYW1lICh1aW50OF90IGNvbXApOworaW50IGdlbmltZ19nZXRfb3NfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGdlbmltZ19nZXRfYXJjaF9pZCAoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZ2VuaW1nX2dldF90eXBlX2lkIChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBnZW5pbWdfZ2V0X2NvbXBfaWQgKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBnZW5pbWdfcHJpbnRfc2l6ZSAodWludDMyX3Qgc2l6ZSk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworLyogSW1hZ2UgZm9ybWF0IHR5cGVzLCByZXR1cm5lZCBieSBfZ2V0X2Zvcm1hdCgpIHJvdXRpbmUgKi8KKyNkZWZpbmUgSU1BR0VfRk9STUFUX0lOVkFMSUQJMHgwMAorI2RlZmluZSBJTUFHRV9GT1JNQVRfTEVHQUNZCTB4MDEJLyogbGVnYWN5IGltYWdlX2hlYWRlciBiYXNlZCBmb3JtYXQgKi8KKyNkZWZpbmUgSU1BR0VfRk9STUFUX0ZJVAkweDAyCS8qIG5ldywgbGliZmR0IGJhc2VkIGZvcm1hdCAqLworCitpbnQgZ2VuaW1nX2dldF9mb3JtYXQgKHZvaWQgKmltZ19hZGRyKTsKK2ludCBnZW5pbWdfaGFzX2NvbmZpZyAoYm9vdG1faGVhZGVyc190ICppbWFnZXMpOwordWxvbmcgZ2VuaW1nX2dldF9pbWFnZSAodWxvbmcgaW1nX2FkZHIpOworCitpbnQgYm9vdF9nZXRfcmFtZGlzayAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIGJvb3RtX2hlYWRlcnNfdCAqaW1hZ2VzLAorCQl1aW50OF90IGFyY2gsIHVsb25nICpyZF9zdGFydCwgdWxvbmcgKnJkX2VuZCk7CisKKworI2lmZGVmIENPTkZJR19PRl9MSUJGRFQKK2ludCBib290X2dldF9mZHQgKGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgYm9vdG1faGVhZGVyc190ICppbWFnZXMsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKTsKK2ludCBib290X3JlbG9jYXRlX2ZkdCAoc3RydWN0IGxtYiAqbG1iLCB1bG9uZyBib290bWFwX2Jhc2UsCisJCWNoYXIgKipvZl9mbGF0X3RyZWUsIHVsb25nICpvZl9zaXplKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfUFBDKSB8fCBkZWZpbmVkKENPTkZJR19NNjhLKQoraW50IGJvb3RfcmFtZGlza19oaWdoIChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nIHJkX2RhdGEsIHVsb25nIHJkX2xlbiwKKwkJICB1bG9uZyAqaW5pdHJkX3N0YXJ0LCB1bG9uZyAqaW5pdHJkX2VuZCk7CisKK2ludCBib290X2dldF9jbWRsaW5lIChzdHJ1Y3QgbG1iICpsbWIsIHVsb25nICpjbWRfc3RhcnQsIHVsb25nICpjbWRfZW5kLAorCQkJdWxvbmcgYm9vdG1hcF9iYXNlKTsKK2ludCBib290X2dldF9rYmQgKHN0cnVjdCBsbWIgKmxtYiwgYmRfdCAqKmtiZCwgdWxvbmcgYm9vdG1hcF9iYXNlKTsKKyNlbmRpZiAvKiBDT05GSUdfUFBDIHx8IENPTkZJR19NNjhLICovCisjZW5kaWYgLyogIVVTRV9IT1NUQ0MgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBMZWdhY3kgZm9ybWF0IHNwZWNpZmljIGNvZGUgKHByZWZpeGVkIHdpdGggaW1hZ2VfKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9oZWFkZXJfc2l6ZSAodm9pZCkKK3sKKwlyZXR1cm4gKHNpemVvZiAoaW1hZ2VfaGVhZGVyX3QpKTsKK30KKworI2RlZmluZSBpbWFnZV9nZXRfaGRyX2woZikgXAorCXN0YXRpYyBpbmxpbmUgdWludDMyX3QgaW1hZ2VfZ2V0XyMjZihjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKSBcCisJeyBcCisJCXJldHVybiB1aW1hZ2VfdG9fY3B1IChoZHItPmloXyMjZik7IFwKKwl9CitpbWFnZV9nZXRfaGRyX2wgKG1hZ2ljKQkJLyogaW1hZ2VfZ2V0X21hZ2ljICovCitpbWFnZV9nZXRfaGRyX2wgKGhjcmMpCQkvKiBpbWFnZV9nZXRfaGNyYyAqLworaW1hZ2VfZ2V0X2hkcl9sICh0aW1lKQkJLyogaW1hZ2VfZ2V0X3RpbWUgKi8KK2ltYWdlX2dldF9oZHJfbCAoc2l6ZSkJCS8qIGltYWdlX2dldF9zaXplICovCitpbWFnZV9nZXRfaGRyX2wgKGxvYWQpCQkvKiBpbWFnZV9nZXRfbG9hZCAqLworaW1hZ2VfZ2V0X2hkcl9sIChlcCkJCS8qIGltYWdlX2dldF9lcCAqLworaW1hZ2VfZ2V0X2hkcl9sIChkY3JjKQkJLyogaW1hZ2VfZ2V0X2RjcmMgKi8KKworI2RlZmluZSBpbWFnZV9nZXRfaGRyX2IoZikgXAorCXN0YXRpYyBpbmxpbmUgdWludDhfdCBpbWFnZV9nZXRfIyNmKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpIFwKKwl7IFwKKwkJcmV0dXJuIGhkci0+aWhfIyNmOyBcCisJfQoraW1hZ2VfZ2V0X2hkcl9iIChvcykJCS8qIGltYWdlX2dldF9vcyAqLworaW1hZ2VfZ2V0X2hkcl9iIChhcmNoKQkJLyogaW1hZ2VfZ2V0X2FyY2ggKi8KK2ltYWdlX2dldF9oZHJfYiAodHlwZSkJCS8qIGltYWdlX2dldF90eXBlICovCitpbWFnZV9nZXRfaGRyX2IgKGNvbXApCQkvKiBpbWFnZV9nZXRfY29tcCAqLworCitzdGF0aWMgaW5saW5lIGNoYXIgKmltYWdlX2dldF9uYW1lIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoY2hhciAqKWhkci0+aWhfbmFtZTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBpbWFnZV9nZXRfZGF0YV9zaXplIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiBpbWFnZV9nZXRfc2l6ZSAoaGRyKTsKK30KKworLyoqCisgKiBpbWFnZV9nZXRfZGF0YSAtIGdldCBpbWFnZSBwYXlsb2FkIHN0YXJ0IGFkZHJlc3MKKyAqIEBoZHI6IGltYWdlIGhlYWRlcgorICoKKyAqIGltYWdlX2dldF9kYXRhKCkgcmV0dXJucyBhZGRyZXNzIG9mIHRoZSBpbWFnZSBwYXlsb2FkLiBGb3Igc2luZ2xlCisgKiBjb21wb25lbnQgaW1hZ2VzIGl0IGlzIGltYWdlIGRhdGEgc3RhcnQuIEZvciBtdWx0aSBjb21wb25lbnQKKyAqIGltYWdlcyBpdCBwb2ludHMgdG8gdGhlIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBzdWItaW1hZ2VzIHNpemVzLgorICoKKyAqIHJldHVybnM6CisgKiAgICAgaW1hZ2UgcGF5bG9hZCBkYXRhIHN0YXJ0IGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSB1bG9uZyBpbWFnZV9nZXRfZGF0YSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKwlyZXR1cm4gKCh1bG9uZyloZHIgKyBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGltYWdlX2dldF9pbWFnZV9zaXplIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X3NpemUgKGhkcikgKyBpbWFnZV9nZXRfaGVhZGVyX3NpemUgKCkpOworfQorc3RhdGljIGlubGluZSB1bG9uZyBpbWFnZV9nZXRfaW1hZ2VfZW5kIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyKQoreworCXJldHVybiAoKHVsb25nKWhkciArIGltYWdlX2dldF9pbWFnZV9zaXplIChoZHIpKTsKK30KKworI2RlZmluZSBpbWFnZV9zZXRfaGRyX2woZikgXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfIyNmKGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQzMl90IHZhbCkgXAorCXsgXAorCQloZHItPmloXyMjZiA9IGNwdV90b191aW1hZ2UgKHZhbCk7IFwKKwl9CitpbWFnZV9zZXRfaGRyX2wgKG1hZ2ljKQkJLyogaW1hZ2Vfc2V0X21hZ2ljICovCitpbWFnZV9zZXRfaGRyX2wgKGhjcmMpCQkvKiBpbWFnZV9zZXRfaGNyYyAqLworaW1hZ2Vfc2V0X2hkcl9sICh0aW1lKQkJLyogaW1hZ2Vfc2V0X3RpbWUgKi8KK2ltYWdlX3NldF9oZHJfbCAoc2l6ZSkJCS8qIGltYWdlX3NldF9zaXplICovCitpbWFnZV9zZXRfaGRyX2wgKGxvYWQpCQkvKiBpbWFnZV9zZXRfbG9hZCAqLworaW1hZ2Vfc2V0X2hkcl9sIChlcCkJCS8qIGltYWdlX3NldF9lcCAqLworaW1hZ2Vfc2V0X2hkcl9sIChkY3JjKQkJLyogaW1hZ2Vfc2V0X2RjcmMgKi8KKworI2RlZmluZSBpbWFnZV9zZXRfaGRyX2IoZikgXAorCXN0YXRpYyBpbmxpbmUgdm9pZCBpbWFnZV9zZXRfIyNmKGltYWdlX2hlYWRlcl90ICpoZHIsIHVpbnQ4X3QgdmFsKSBcCisJeyBcCisJCWhkci0+aWhfIyNmID0gdmFsOyBcCisJfQoraW1hZ2Vfc2V0X2hkcl9iIChvcykJCS8qIGltYWdlX3NldF9vcyAqLworaW1hZ2Vfc2V0X2hkcl9iIChhcmNoKQkJLyogaW1hZ2Vfc2V0X2FyY2ggKi8KK2ltYWdlX3NldF9oZHJfYiAodHlwZSkJCS8qIGltYWdlX3NldF90eXBlICovCitpbWFnZV9zZXRfaGRyX2IgKGNvbXApCQkvKiBpbWFnZV9zZXRfY29tcCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaW1hZ2Vfc2V0X25hbWUgKGltYWdlX2hlYWRlcl90ICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RybmNweSAoaW1hZ2VfZ2V0X25hbWUgKGhkciksIG5hbWUsIElIX05NTEVOKTsKK30KKworaW50IGltYWdlX2NoZWNrX2hjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOworaW50IGltYWdlX2NoZWNrX2RjcmMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOworI2lmbmRlZiBVU0VfSE9TVENDCitpbnQgZ2V0ZW52X3llc25vIChjaGFyICp2YXIpOwordWxvbmcgZ2V0ZW52X2Jvb3RtX2xvdyh2b2lkKTsKK3BoeXNfc2l6ZV90IGdldGVudl9ib290bV9zaXplKHZvaWQpOwordm9pZCBtZW1tb3ZlX3dkICh2b2lkICp0bywgdm9pZCAqZnJvbSwgc2l6ZV90IGxlbiwgdWxvbmcgY2h1bmtzeik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfbWFnaWMgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfbWFnaWMgKGhkcikgPT0gSUhfTUFHSUMpOworfQorc3RhdGljIGlubGluZSBpbnQgaW1hZ2VfY2hlY2tfdHlwZSAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkciwgdWludDhfdCB0eXBlKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X3R5cGUgKGhkcikgPT0gdHlwZSk7Cit9CitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja19hcmNoIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IGFyY2gpCit7CisJcmV0dXJuIChpbWFnZV9nZXRfYXJjaCAoaGRyKSA9PSBhcmNoKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGltYWdlX2NoZWNrX29zIChjb25zdCBpbWFnZV9oZWFkZXJfdCAqaGRyLCB1aW50OF90IG9zKQoreworCXJldHVybiAoaW1hZ2VfZ2V0X29zIChoZHIpID09IG9zKTsKK30KKwordWxvbmcgaW1hZ2VfbXVsdGlfY291bnQgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIpOwordm9pZCBpbWFnZV9tdWx0aV9nZXRpbWcgKGNvbnN0IGltYWdlX2hlYWRlcl90ICpoZHIsIHVsb25nIGlkeCwKKwkJCXVsb25nICpkYXRhLCB1bG9uZyAqbGVuKTsKKwordm9pZCBpbWFnZV9wcmludF9jb250ZW50cyAoY29uc3Qgdm9pZCAqaGRyKTsKKworI2lmbmRlZiBVU0VfSE9TVENDCitzdGF0aWMgaW5saW5lIGludCBpbWFnZV9jaGVja190YXJnZXRfYXJjaCAoY29uc3QgaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKyNpZiBkZWZpbmVkKF9fQVJNX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQVJNKSkKKyNlbGlmIGRlZmluZWQoX19hdnIzMl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX0FWUjMyKSkKKyNlbGlmIGRlZmluZWQoX19iZmluX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfQkxBQ0tGSU4pKQorI2VsaWYgZGVmaW5lZChfX0kzODZfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9JMzg2KSkKKyNlbGlmIGRlZmluZWQoX19NNjhLX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfTTY4SykpCisjZWxpZiBkZWZpbmVkKF9fbWljcm9ibGF6ZV9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX01JQ1JPQkxBWkUpKQorI2VsaWYgZGVmaW5lZChfX21pcHNfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9NSVBTKSkKKyNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQorCWlmICghaW1hZ2VfY2hlY2tfYXJjaCAoaGRyLCBJSF9BUkNIX05JT1MyKSkKKyNlbGlmIGRlZmluZWQoX19QUENfXykKKwlpZiAoIWltYWdlX2NoZWNrX2FyY2ggKGhkciwgSUhfQVJDSF9QUEMpKQorI2VsaWYgZGVmaW5lZChfX3NoX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfU0gpKQorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJaWYgKCFpbWFnZV9jaGVja19hcmNoIChoZHIsIElIX0FSQ0hfU1BBUkMpKQorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBDUFUgdHlwZQorI2VuZGlmCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogVVNFX0hPU1RDQyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5ldyB1SW1hZ2UgZm9ybWF0IHNwZWNpZmljIGNvZGUgKHByZWZpeGVkIHdpdGggZml0XykgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoQ09ORklHX0ZJVCkKKworI2RlZmluZSBGSVRfSU1BR0VTX1BBVEgJCSIvaW1hZ2VzIgorI2RlZmluZSBGSVRfQ09ORlNfUEFUSAkJIi9jb25maWd1cmF0aW9ucyIKKworLyogaGFzaCBub2RlICovCisjZGVmaW5lIEZJVF9IQVNIX05PREVOQU1FCSJoYXNoIgorI2RlZmluZSBGSVRfQUxHT19QUk9QCQkiYWxnbyIKKyNkZWZpbmUgRklUX1ZBTFVFX1BST1AJCSJ2YWx1ZSIKKworLyogaW1hZ2Ugbm9kZSAqLworI2RlZmluZSBGSVRfREFUQV9QUk9QCQkiZGF0YSIKKyNkZWZpbmUgRklUX1RJTUVTVEFNUF9QUk9QCSJ0aW1lc3RhbXAiCisjZGVmaW5lIEZJVF9ERVNDX1BST1AJCSJkZXNjcmlwdGlvbiIKKyNkZWZpbmUgRklUX0FSQ0hfUFJPUAkJImFyY2giCisjZGVmaW5lIEZJVF9UWVBFX1BST1AJCSJ0eXBlIgorI2RlZmluZSBGSVRfT1NfUFJPUAkJIm9zIgorI2RlZmluZSBGSVRfQ09NUF9QUk9QCQkiY29tcHJlc3Npb24iCisjZGVmaW5lIEZJVF9FTlRSWV9QUk9QCQkiZW50cnkiCisjZGVmaW5lIEZJVF9MT0FEX1BST1AJCSJsb2FkIgorCisvKiBjb25maWd1cmF0aW9uIG5vZGUgKi8KKyNkZWZpbmUgRklUX0tFUk5FTF9QUk9QCQkia2VybmVsIgorI2RlZmluZSBGSVRfUkFNRElTS19QUk9QCSJyYW1kaXNrIgorI2RlZmluZSBGSVRfRkRUX1BST1AJCSJmZHQiCisjZGVmaW5lIEZJVF9ERUZBVUxUX1BST1AJImRlZmF1bHQiCisKKyNkZWZpbmUgRklUX01BWF9IQVNIX0xFTgkyMAkvKiBtYXgoY3JjMzJfbGVuKDQpLCBzaGExX2xlbigyMCkpICovCisKKy8qIGNtZGxpbmUgYXJndW1lbnQgZm9ybWF0IHBhcnNpbmcgKi8KK2lubGluZSBpbnQgZml0X3BhcnNlX2NvbmYgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKipjb25mX25hbWUpOworaW5saW5lIGludCBmaXRfcGFyc2Vfc3ViaW1hZ2UgKGNvbnN0IGNoYXIgKnNwZWMsIHVsb25nIGFkZHJfY3VyciwKKwkJdWxvbmcgKmFkZHIsIGNvbnN0IGNoYXIgKippbWFnZV9uYW1lKTsKKwordm9pZCBmaXRfcHJpbnRfY29udGVudHMgKGNvbnN0IHZvaWQgKmZpdCk7Cit2b2lkIGZpdF9pbWFnZV9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCk7Cit2b2lkIGZpdF9pbWFnZV9wcmludF9oYXNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCBjb25zdCBjaGFyICpwKTsKKworLyoqCisgKiBmaXRfZ2V0X2VuZCAtIGdldCBGSVQgaW1hZ2Ugc2l6ZQorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiByZXR1cm5zOgorICogICAgIHNpemUgb2YgdGhlIEZJVCBpbWFnZSAoYmxvYikgaW4gbWVtb3J5CisgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgZml0X2dldF9zaXplIChjb25zdCB2b2lkICpmaXQpCit7CisJcmV0dXJuIGZkdF90b3RhbHNpemUgKGZpdCk7Cit9CisKKy8qKgorICogZml0X2dldF9lbmQgLSBnZXQgRklUIGltYWdlIGVuZAorICogQGZpdDogcG9pbnRlciB0byB0aGUgRklUIGZvcm1hdCBpbWFnZSBoZWFkZXIKKyAqCisgKiByZXR1cm5zOgorICogICAgIGVuZCBhZGRyZXNzIG9mIHRoZSBGSVQgaW1hZ2UgKGJsb2IpIGluIG1lbW9yeQorICovCitzdGF0aWMgaW5saW5lIHVsb25nIGZpdF9nZXRfZW5kIChjb25zdCB2b2lkICpmaXQpCit7CisJcmV0dXJuICh1bG9uZylmaXQgKyBmZHRfdG90YWxzaXplIChmaXQpOworfQorCisvKioKKyAqIGZpdF9nZXRfbmFtZSAtIGdldCBGSVQgbm9kZSBuYW1lCisgKiBAZml0OiBwb2ludGVyIHRvIHRoZSBGSVQgZm9ybWF0IGltYWdlIGhlYWRlcgorICoKKyAqIHJldHVybnM6CisgKiAgICAgTlVMTCwgb24gZXJyb3IKKyAqICAgICBwb2ludGVyIHRvIG5vZGUgbmFtZSwgb24gc3VjY2VzcworICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZpdF9nZXRfbmFtZSAoY29uc3Qgdm9pZCAqZml0X2hkciwKKwkJaW50IG5vZmZzZXQsIGludCAqbGVuKQoreworCXJldHVybiBmZHRfZ2V0X25hbWUgKGZpdF9oZHIsIG5vZmZzZXQsIGxlbik7Cit9CisKK2ludCBmaXRfZ2V0X2Rlc2MgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIGNoYXIgKipkZXNjKTsKK2ludCBmaXRfZ2V0X3RpbWVzdGFtcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdGltZV90ICp0aW1lc3RhbXApOworCitpbnQgZml0X2ltYWdlX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmltYWdlX3VuYW1lKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X29zIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICpvcyk7CitpbnQgZml0X2ltYWdlX2dldF9hcmNoIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICphcmNoKTsKK2ludCBmaXRfaW1hZ2VfZ2V0X3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgKnR5cGUpOworaW50IGZpdF9pbWFnZV9nZXRfY29tcCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqY29tcCk7CitpbnQgZml0X2ltYWdlX2dldF9sb2FkIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1bG9uZyAqbG9hZCk7CitpbnQgZml0X2ltYWdlX2dldF9lbnRyeSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWxvbmcgKmVudHJ5KTsKK2ludCBmaXRfaW1hZ2VfZ2V0X2RhdGEgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsCisJCQkJY29uc3Qgdm9pZCAqKmRhdGEsIHNpemVfdCAqc2l6ZSk7CisKK2ludCBmaXRfaW1hZ2VfaGFzaF9nZXRfYWxnbyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY2hhciAqKmFsZ28pOworaW50IGZpdF9pbWFnZV9oYXNoX2dldF92YWx1ZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCAqKnZhbHVlLAorCQkJCWludCAqdmFsdWVfbGVuKTsKKworaW50IGZpdF9zZXRfdGltZXN0YW1wICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB0aW1lX3QgdGltZXN0YW1wKTsKK2ludCBmaXRfc2V0X2hhc2hlcyAodm9pZCAqZml0KTsKK2ludCBmaXRfaW1hZ2Vfc2V0X2hhc2hlcyAodm9pZCAqZml0LCBpbnQgaW1hZ2Vfbm9mZnNldCk7CitpbnQgZml0X2ltYWdlX2hhc2hfc2V0X3ZhbHVlICh2b2lkICpmaXQsIGludCBub2Zmc2V0LCB1aW50OF90ICp2YWx1ZSwKKwkJCQlpbnQgdmFsdWVfbGVuKTsKKworaW50IGZpdF9pbWFnZV9jaGVja19oYXNoZXMgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQpOworaW50IGZpdF9hbGxfaW1hZ2VfY2hlY2tfaGFzaGVzIChjb25zdCB2b2lkICpmaXQpOworaW50IGZpdF9pbWFnZV9jaGVja19vcyAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgdWludDhfdCBvcyk7CitpbnQgZml0X2ltYWdlX2NoZWNrX2FyY2ggKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgYXJjaCk7CitpbnQgZml0X2ltYWdlX2NoZWNrX3R5cGUgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgdHlwZSk7CitpbnQgZml0X2ltYWdlX2NoZWNrX2NvbXAgKGNvbnN0IHZvaWQgKmZpdCwgaW50IG5vZmZzZXQsIHVpbnQ4X3QgY29tcCk7CitpbnQgZml0X2NoZWNrX2Zvcm1hdCAoY29uc3Qgdm9pZCAqZml0KTsKKworaW50IGZpdF9jb25mX2dldF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGNvbnN0IGNoYXIgKmNvbmZfdW5hbWUpOworaW50IGZpdF9jb25mX2dldF9rZXJuZWxfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2NvbmZfZ2V0X3JhbWRpc2tfbm9kZSAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCk7CitpbnQgZml0X2NvbmZfZ2V0X2ZkdF9ub2RlIChjb25zdCB2b2lkICpmaXQsIGludCBub2Zmc2V0KTsKKwordm9pZCBmaXRfY29uZl9wcmludCAoY29uc3Qgdm9pZCAqZml0LCBpbnQgbm9mZnNldCwgY29uc3QgY2hhciAqcCk7CisKKyNpZm5kZWYgVVNFX0hPU1RDQworc3RhdGljIGlubGluZSBpbnQgZml0X2ltYWdlX2NoZWNrX3RhcmdldF9hcmNoIChjb25zdCB2b2lkICpmZHQsIGludCBub2RlKQoreworI2lmIGRlZmluZWQoX19BUk1fXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfQVJNKSkKKyNlbGlmIGRlZmluZWQoX19hdnIzMl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9BVlIzMikpCisjZWxpZiBkZWZpbmVkKF9fYmZpbl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9CTEFDS0ZJTikpCisjZWxpZiBkZWZpbmVkKF9fSTM4Nl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9JMzg2KSkKKyNlbGlmIGRlZmluZWQoX19NNjhLX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX002OEspKQorI2VsaWYgZGVmaW5lZChfX21pY3JvYmxhemVfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfTUlDUk9CTEFaRSkpCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9NSVBTKSkKKyNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQorCWlmICghZml0X2ltYWdlX2NoZWNrX2FyY2ggKGZkdCwgbm9kZSwgSUhfQVJDSF9OSU9TMikpCisjZWxpZiBkZWZpbmVkKF9fUFBDX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX1BQQykpCisjZWxpZiBkZWZpbmVkKF9fc2hfXykKKwlpZiAoIWZpdF9pbWFnZV9jaGVja19hcmNoIChmZHQsIG5vZGUsIElIX0FSQ0hfU0gpKQorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisJaWYgKCFmaXRfaW1hZ2VfY2hlY2tfYXJjaCAoZmR0LCBub2RlLCBJSF9BUkNIX1NQQVJDKSkKKyNlbHNlCisjIGVycm9yIFVua25vd24gQ1BVIHR5cGUKKyNlbmRpZgorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorI2VuZGlmIC8qIFVTRV9IT1NUQ0MgKi8KKworI2lmZGVmIENPTkZJR19GSVRfVkVSQk9TRQorI2RlZmluZSBmaXRfdW5zdXBwb3J0ZWQobXNnKQlwcmludGYgKCIhICVzOiVkICIgXAorCQkJCSJGSVQgaW1hZ2VzIG5vdCBzdXBwb3J0ZWQgZm9yICclcydcbiIsIFwKKwkJCQlfX0ZJTEVfXywgX19MSU5FX18sIChtc2cpKQorCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZF9yZXNldChtc2cpCXByaW50ZiAoIiEgJXM6JWQgIiBcCisJCQkJIkZJVCBpbWFnZXMgbm90IHN1cHBvcnRlZCBmb3IgJyVzJyAiIFwKKwkJCQkiLSBtdXN0IHJlc2V0IGJvYXJkIHRvIHJlY292ZXIhXG4iLCBcCisJCQkJX19GSUxFX18sIF9fTElORV9fLCAobXNnKSkKKyNlbHNlCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZChtc2cpCisjZGVmaW5lIGZpdF91bnN1cHBvcnRlZF9yZXNldChtc2cpCisjZW5kaWYgLyogQ09ORklHX0ZJVF9WRVJCT1NFICovCisjZW5kaWYgLyogQ09ORklHX0ZJVCAqLworCisjZW5kaWYJLyogX19JTUFHRV9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOWIwYzg2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvYmlnX2VuZGlhbi5oCkBAIC0wLDAgKzEsNjkgQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9CSUdfRU5ESUFOX0gKKworI2lmbmRlZiBfX0JJR19FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIDQzMjEKKyNlbmRpZgorI2lmbmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgX19CSUdfRU5ESUFOX0JJVEZJRUxECisjZW5kaWYKKyNkZWZpbmUJX19CWVRFX09SREVSCV9fQklHX0VORElBTgorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL3N3YWIuaD4KKworI2RlZmluZSBfX2NvbnN0YW50X2h0b25sKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hsKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X250b2hzKHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19sZTY0KHgpIF9fX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkgX19fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUzMih4KSBfX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpIF9fX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoeCkgX19fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KSBfX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0KHgpIF9fc3dhYjY0KCh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2xlMzIoeCkgX19zd2FiMzIoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1KHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSBfX3N3YWIxNigoeCkpCisjZGVmaW5lIF9fbGUxNl90b19jcHUoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1KHgpICgoX191NjQpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpICgoX191MTYpKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cCh4KSBfX3N3YWI2NHAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cCh4KSBfX3N3YWIzMnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cCh4KSBfX3N3YWIxNnAoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2JlNjRfdG9fY3B1cCh4KSAoKihfX3U2NCopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMycCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cCh4KSAoKihfX3UzMiopKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTE2cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1cCh4KSAoKihfX3UxNiopKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTY0cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2xlNjRfdG9fY3B1cyh4KSBfX3N3YWI2NHMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2xlMzJfdG9fY3B1cyh4KSBfX3N3YWIzMnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19sZTE2cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBfX3N3YWIxNnMoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTY0cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2JlMzJzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2JlMzJfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fYmUxNl90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfQklHX0VORElBTl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9nZW5lcmljLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ZmODUwZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaApAQCAtMCwwICsxLDE4MCBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAorCisvKgorICogbGludXgvYnl0ZW9yZGVyX2dlbmVyaWMuaAorICogR2VuZXJpYyBCeXRlLXJlb3JkZXJpbmcgc3VwcG9ydAorICoKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzA3MDcKKyAqICAgIGdhdGhlcmVkIGFsbCB0aGUgZ29vZCBpZGVhcyBmcm9tIGFsbCBhc20tZm9vL2J5dGVvcmRlci5oIGludG8gb25lIGZpbGUsCisgKiAgICBjbGVhbmVkIHRoZW0gdXAuCisgKiAgICBJIGhvcGUgaXQgaXMgY29tcGxpYW50IHdpdGggbm9uLUdDQyBjb21waWxlcnMuCisgKiAgICBJIGRlY2lkZWQgdG8gcHV0IF9fQllURU9SREVSX0hBU19VNjRfXyBpbiBieXRlb3JkZXIuaCwKKyAqICAgIGJlY2F1c2UgSSB3YXNuJ3Qgc3VyZSBpdCB3b3VsZCBiZSBvayB0byBwdXQgaXQgaW4gdHlwZXMuaAorICogICAgVXBncmFkZWQgaXQgdG8gMi4xLjQzCisgKiBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcxMDEyCisgKiAgICBVcGdyYWRlZCBpdCB0byAyLjEuNTcKKyAqICAgIHRvIHBsZWFzZSBMaW51cyBULiwgcmVwbGFjZWQgaHVnZSAjaWZkZWYncyBiZXR3ZWVuIGxpdHRsZS9iaWcgZW5kaWFuCisgKiAgICBieSBuZXN0ZWRseSAjaW5jbHVkZSdkIGZpbGVzLgorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPiAxOTk3MTIwNQorICogICAgTWFkZSBpdCB0byAyLjEuNzE7IG5vdyBhIGZhY2VsaWZ0OgorICogICAgUHV0IGZpbGVzIHVuZGVyIGluY2x1ZGUvbGludXgvYnl0ZW9yZGVyLworICogICAgU3BsaXQgc3dhYiBmcm9tIGdlbmVyaWMgc3VwcG9ydC4KKyAqCisgKiBUT0RPOgorICogICA9IFJlZ3VsYXIga2VybmVsIG1haW50YWluZXJzIGNvdWxkIGFsc28gcmVwbGFjZSBhbGwgdGhlc2UgbWFudWFsCisgKiAgICBieXRlc3dhcCBtYWNyb3MgdGhhdCByZW1haW4sIGRpc3NlbWluYXRlZCBhbW9uZyBkcml2ZXJzLAorICogICAgYWZ0ZXIgc29tZSBncmVwIG9yIHRoZSBzb3VyY2VzLi4uCisgKiAgID0gTGludXMgbWlnaHQgd2FudCB0byByZW5hbWUgYWxsIHRoZXNlIG1hY3JvcyBhbmQgZmlsZXMgdG8gZml0IGhpcyB0YXN0ZSwKKyAqICAgIHRvIGZpdCBoaXMgcGVyc29uYWwgbmFtaW5nIHNjaGVtZS4KKyAqICAgPSBpdCBzZWVtcyB0aGF0IGEgZmV3IGRyaXZlcnMgd291bGQgYWxzbyBhcHByZWNpYXRlCisgKiAgICBueWJibGUgc3dhcHBpbmcgc3VwcG9ydC4uLgorICogICA9IGV2ZXJ5IGFyY2hpdGVjdHVyZSBjb3VsZCBhZGQgdGhlaXIgYnl0ZXN3YXAgbWFjcm8gaW4gYXNtL2J5dGVvcmRlci5oCisgKiAgICBzZWUgaG93IHNvbWUgYXJjaGl0ZWN0dXJlcyBhbHJlYWR5IGRvIChpMzg2LCBhbHBoYSwgcHBjLCBldGMpCisgKiAgID0gY3B1X3RvX2JlWFggYW5kIGJlWFhfdG9fY3B1IG1pZ2h0IHNvbWUgZGF5IG5lZWQgdG8gYmUgd2VsbAorICogICAgZGlzdGluZ3Vpc2hlZCB0aHJvdWdob3V0IHRoZSBrZXJuZWwuIFRoaXMgaXMgbm90IHRoZSBjYXNlIGN1cnJlbnRseSwKKyAqICAgIHNpbmNlIGxpdHRsZSBlbmRpYW4sIGJpZyBlbmRpYW4sIGFuZCBwZHAgZW5kaWFuIG1hY2hpbmVzIG5lZWRuJ3QgaXQuCisgKiAgICBCdXQgdGhpcyBtaWdodCBiZSB0aGUgY2FzZSBmb3IsIHNheSwgYSBwb3J0IG9mIExpbnV4IHRvIDIwLzIxIGJpdAorICogICAgYXJjaGl0ZWN0dXJlcyAoYW5kIEYyMSBMaW51eCBhZGRpY3QgYXJvdW5kPykuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB0byBiZSBkZWZpbmVkIGJ5IDxhc20vYnl0ZW9yZGVyLmg+OgorICoKKyAqIENvbnZlcnNpb24gb2YgbG9uZyBhbmQgc2hvcnQgaW50IGJldHdlZW4gbmV0d29yayBhbmQgaG9zdCBmb3JtYXQKKyAqCW50b2hsKF9fdTMyIHgpCisgKgludG9ocyhfX3UxNiB4KQorICoJaHRvbmwoX191MzIgeCkKKyAqCWh0b25zKF9fdTE2IHgpCisgKiBJdCBzZWVtcyB0aGF0IHNvbWUgcHJvZ3JhbXMgKHdoaWNoPyB3aGVyZT8gb3IgcGVyaGFwcyBhIHN0YW5kYXJkPyBQT1NJWD8pCisgKiBtaWdodCBsaWtlIHRoZSBhYm92ZSB0byBiZSBmdW5jdGlvbnMsIG5vdCBtYWNyb3MgKHdoeT8pLgorICogaWYgdGhhdCdzIHRydWUsIHRoZW4gZGV0ZWN0IHRoZW0sIGFuZCB0YWtlIG1lYXN1cmVzLgorICogQW55d2F5LCB0aGUgbWVhc3VyZSBpczogZGVmaW5lIG9ubHkgX19fbnRvaGwgYXMgYSBtYWNybyBpbnN0ZWFkLAorICogYW5kIGluIGEgc2VwYXJhdGUgZmlsZSwgaGF2ZQorICogdW5zaWduZWQgbG9uZyBpbmxpbmUgbnRvaGwoeCl7cmV0dXJuIF9fX250b2hsKHgpO30KKyAqCisgKiBUaGUgc2FtZSBmb3IgY29uc3RhbnQgYXJndW1lbnRzCisgKglfX2NvbnN0YW50X250b2hsKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X250b2hzKF9fdTE2IHgpCisgKglfX2NvbnN0YW50X2h0b25sKF9fdTMyIHgpCisgKglfX2NvbnN0YW50X2h0b25zKF9fdTE2IHgpCisgKgorICogQ29udmVyc2lvbiBvZiBYWC1iaXQgaW50ZWdlcnMgKDE2LSAzMi0gb3IgNjQtKQorICogYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdCBhbmQgbGl0dGxlL2JpZyBlbmRpYW4gZm9ybWF0CisgKiA2NC1iaXQgc3R1ZmYgb25seSBkZWZpbmVkIGZvciBwcm9wZXIgYXJjaGl0ZWN0dXJlcworICoJY3B1X3RvX1tibF1lWFgoX191WFggeCkKKyAqCVtibF1lWFhfdG9fY3B1KF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRvIGNvbnZlcnQKKyAqCWNwdV90b19bYmxdZVhYcChfX3VYWCB4KQorICoJW2JsXWVYWF90b19jcHVwKF9fdVhYIHgpCisgKgorICogVGhlIHNhbWUsIGJ1dCBjaGFuZ2UgaW4gc2l0dQorICoJY3B1X3RvX1tibF1lWFhzKF9fdVhYIHgpCisgKglbYmxdZVhYX3RvX2NwdXMoX191WFggeCkKKyAqCisgKiBTZWUgYXNtLWZvby9ieXRlb3JkZXIuaCBmb3IgZXhhbXBsZXMgb2YgaG93IHRvIHByb3ZpZGUKKyAqIGFyY2hpdGVjdHVyZS1vcHRpbWl6ZWQgdmVyc2lvbnMKKyAqCisgKi8KKworCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorLyoKKyAqIGluc2lkZSB0aGUga2VybmVsLCB3ZSBjYW4gdXNlIG5pY2tuYW1lczsKKyAqIG91dHNpZGUgb2YgaXQsIHdlIG11c3QgYXZvaWQgUE9TSVggbmFtZXNwYWNlIHBvbGx1dGlvbi4uLgorICovCisjZGVmaW5lIGNwdV90b19sZTY0IF9fY3B1X3RvX2xlNjQKKyNkZWZpbmUgbGU2NF90b19jcHUgX19sZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fbGUzMiBfX2NwdV90b19sZTMyCisjZGVmaW5lIGxlMzJfdG9fY3B1IF9fbGUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2xlMTYgX19jcHVfdG9fbGUxNgorI2RlZmluZSBsZTE2X3RvX2NwdSBfX2xlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19iZTY0IF9fY3B1X3RvX2JlNjQKKyNkZWZpbmUgYmU2NF90b19jcHUgX19iZTY0X3RvX2NwdQorI2RlZmluZSBjcHVfdG9fYmUzMiBfX2NwdV90b19iZTMyCisjZGVmaW5lIGJlMzJfdG9fY3B1IF9fYmUzMl90b19jcHUKKyNkZWZpbmUgY3B1X3RvX2JlMTYgX19jcHVfdG9fYmUxNgorI2RlZmluZSBiZTE2X3RvX2NwdSBfX2JlMTZfdG9fY3B1CisjZGVmaW5lIGNwdV90b19sZTY0cCBfX2NwdV90b19sZTY0cAorI2RlZmluZSBsZTY0X3RvX2NwdXAgX19sZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2xlMzJwIF9fY3B1X3RvX2xlMzJwCisjZGVmaW5lIGxlMzJfdG9fY3B1cCBfX2xlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fbGUxNnAgX19jcHVfdG9fbGUxNnAKKyNkZWZpbmUgbGUxNl90b19jcHVwIF9fbGUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19iZTY0cCBfX2NwdV90b19iZTY0cAorI2RlZmluZSBiZTY0X3RvX2NwdXAgX19iZTY0X3RvX2NwdXAKKyNkZWZpbmUgY3B1X3RvX2JlMzJwIF9fY3B1X3RvX2JlMzJwCisjZGVmaW5lIGJlMzJfdG9fY3B1cCBfX2JlMzJfdG9fY3B1cAorI2RlZmluZSBjcHVfdG9fYmUxNnAgX19jcHVfdG9fYmUxNnAKKyNkZWZpbmUgYmUxNl90b19jcHVwIF9fYmUxNl90b19jcHVwCisjZGVmaW5lIGNwdV90b19sZTY0cyBfX2NwdV90b19sZTY0cworI2RlZmluZSBsZTY0X3RvX2NwdXMgX19sZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2xlMzJzIF9fY3B1X3RvX2xlMzJzCisjZGVmaW5lIGxlMzJfdG9fY3B1cyBfX2xlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fbGUxNnMgX19jcHVfdG9fbGUxNnMKKyNkZWZpbmUgbGUxNl90b19jcHVzIF9fbGUxNl90b19jcHVzCisjZGVmaW5lIGNwdV90b19iZTY0cyBfX2NwdV90b19iZTY0cworI2RlZmluZSBiZTY0X3RvX2NwdXMgX19iZTY0X3RvX2NwdXMKKyNkZWZpbmUgY3B1X3RvX2JlMzJzIF9fY3B1X3RvX2JlMzJzCisjZGVmaW5lIGJlMzJfdG9fY3B1cyBfX2JlMzJfdG9fY3B1cworI2RlZmluZSBjcHVfdG9fYmUxNnMgX19jcHVfdG9fYmUxNnMKKyNkZWZpbmUgYmUxNl90b19jcHVzIF9fYmUxNl90b19jcHVzCisjZW5kaWYKKworCisvKgorICogSGFuZGxlIG50b2hsIGFuZCBzdWNoZXMuIFRoZXNlIGhhdmUgdmFyaW91cyBjb21wYXRpYmlsaXR5CisgKiBpc3N1ZXMgLSBsaWtlIHdlIHdhbnQgdG8gZ2l2ZSB0aGUgcHJvdG90eXBlIGV2ZW4gdGhvdWdoIHdlCisgKiBhbHNvIGhhdmUgYSBtYWNybyBmb3IgdGhlbSBpbiBjYXNlIHNvbWUgc3RyYW5nZSBwcm9ncmFtCisgKiB3YW50cyB0byB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSB0aGluZyBvciBzb21ldGhpbmcuLgorICoKKyAqIE5vdGUgdGhhdCB0aGVzZSB1c2VkIHRvIHJldHVybiBhICJsb25nIiBpbiBsaWJjNSwgZXZlbiB0aG91Z2gKKyAqIGxvbmcgaXMgb2Z0ZW4gNjQtYml0IHRoZXNlIGRheXMuLiBUaHVzIHRoZSBjYXN0cy4KKyAqCisgKiBUaGV5IGhhdmUgdG8gYmUgbWFjcm9zIGluIG9yZGVyIHRvIGRvIHRoZSBjb25zdGFudCBmb2xkaW5nCisgKiBjb3JyZWN0bHkgLSBpZiB0aGUgYXJndW1lbnQgcGFzc2VkIGludG8gYSBpbmxpbmUgZnVuY3Rpb24KKyAqIGl0IGlzIG5vIGxvbmdlciBjb25zdGFudCBhY2NvcmRpbmcgdG8gZ2NjLi4KKyAqLworCisjdW5kZWYgbnRvaGwKKyN1bmRlZiBudG9ocworI3VuZGVmIGh0b25sCisjdW5kZWYgaHRvbnMKKworLyoKKyAqIERvIHRoZSBwcm90b3R5cGVzLiBTb21lYm9keSBtaWdodCB3YW50IHRvIHRha2UgdGhlCisgKiBhZGRyZXNzIG9yIHNvbWUgc3VjaCBzaWNrIHRoaW5nLi4KKyAqLworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgKGRlZmluZWQgKF9fR0xJQkNfXykgJiYgX19HTElCQ19fID49IDIpCitleHRlcm4gX191MzIJCQludG9obChfX3UzMik7CitleHRlcm4gX191MzIJCQlodG9ubChfX3UzMik7CisjZWxzZQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50CW50b2hsKHVuc2lnbmVkIGxvbmcgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGludAlodG9ubCh1bnNpZ25lZCBsb25nIGludCk7CisjZW5kaWYKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJbnRvaHModW5zaWduZWQgc2hvcnQgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQJaHRvbnModW5zaWduZWQgc2hvcnQgaW50KTsKKworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKF9fR05VQ19fID49IDIpCisKKyNkZWZpbmUgX19faHRvbmwoeCkgX19jcHVfdG9fYmUzMih4KQorI2RlZmluZSBfX19odG9ucyh4KSBfX2NwdV90b19iZTE2KHgpCisjZGVmaW5lIF9fX250b2hsKHgpIF9fYmUzMl90b19jcHUoeCkKKyNkZWZpbmUgX19fbnRvaHMoeCkgX19iZTE2X3RvX2NwdSh4KQorCisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCAoZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMikKKyNkZWZpbmUgaHRvbmwoeCkgX19faHRvbmwoeCkKKyNkZWZpbmUgbnRvaGwoeCkgX19fbnRvaGwoeCkKKyNlbHNlCisjZGVmaW5lIGh0b25sKHgpICgodW5zaWduZWQgbG9uZylfX19odG9ubCh4KSkKKyNkZWZpbmUgbnRvaGwoeCkgKCh1bnNpZ25lZCBsb25nKV9fX250b2hsKHgpKQorI2VuZGlmCisjZGVmaW5lIGh0b25zKHgpIF9fX2h0b25zKHgpCisjZGVmaW5lIG50b2hzKHgpIF9fX250b2hzKHgpCisKKyNlbmRpZiAvKiBPUFRJTUlaRSAqLworCisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvbGl0dGxlX2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE0NmYzZWMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9saXR0bGVfZW5kaWFuLmgKQEAgLTAsMCArMSw2OSBAQAorI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSAorCisjaWZuZGVmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU4gMTIzNAorI2VuZGlmCisjaWZuZGVmIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorI2RlZmluZSBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNlbmRpZgorI2RlZmluZQlfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCisKKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvc3dhYi5oPgorCisjZGVmaW5lIF9fY29uc3RhbnRfaHRvbmwoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9udG9obCh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2h0b25zKHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfbnRvaHMoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9jcHVfdG9fYmU2NCh4KSBfX19jb25zdGFudF9zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2JlNjRfdG9fY3B1KHgpIF9fX2NvbnN0YW50X3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfY3B1X3RvX2JlMzIoeCkgX19fY29uc3RhbnRfc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19jb25zdGFudF9iZTMyX3RvX2NwdSh4KSBfX19jb25zdGFudF9zd2FiMzIoKHgpKQorI2RlZmluZSBfX2NvbnN0YW50X2NwdV90b19iZTE2KHgpIF9fX2NvbnN0YW50X3N3YWIxNigoeCkpCisjZGVmaW5lIF9fY29uc3RhbnRfYmUxNl90b19jcHUoeCkgX19fY29uc3RhbnRfc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NCh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdSh4KSAoKF9fdTY0KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMih4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdSh4KSAoKF9fdTMyKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNih4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdSh4KSAoKF9fdTE2KSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NCh4KSBfX3N3YWI2NCgoeCkpCisjZGVmaW5lIF9fYmU2NF90b19jcHUoeCkgX19zd2FiNjQoKHgpKQorI2RlZmluZSBfX2NwdV90b19iZTMyKHgpIF9fc3dhYjMyKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdSh4KSBfX3N3YWIzMigoeCkpCisjZGVmaW5lIF9fY3B1X3RvX2JlMTYoeCkgX19zd2FiMTYoKHgpKQorI2RlZmluZSBfX2JlMTZfdG9fY3B1KHgpIF9fc3dhYjE2KCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19sZTY0X3RvX2NwdXAoeCkgKCooX191NjQqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUzMnAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXAoeCkgKCooX191MzIqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGUxNnAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19sZTE2X3RvX2NwdXAoeCkgKCooX191MTYqKSh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXAoeCkgX19zd2FiNjRwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXAoeCkgX19zd2FiMzJwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXAoeCkgX19zd2FiMTZwKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fbGU2NHMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fbGU2NF90b19jcHVzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2NwdV90b19sZTMycyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19sZTMyX3RvX2NwdXMoeCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIF9fY3B1X3RvX2xlMTZzKHgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBfX2xlMTZfdG9fY3B1cyh4KSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgX19jcHVfdG9fYmU2NHMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19iZTY0X3RvX2NwdXMoeCkgX19zd2FiNjRzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUzMnMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19iZTMyX3RvX2NwdXMoeCkgX19zd2FiMzJzKCh4KSkKKyNkZWZpbmUgX19jcHVfdG9fYmUxNnMoeCkgX19zd2FiMTZzKCh4KSkKKyNkZWZpbmUgX19iZTE2X3RvX2NwdXMoeCkgX19zd2FiMTZzKCh4KSkKKworI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisKKyNlbmRpZiAvKiBfTElOVVhfQllURU9SREVSX0xJVFRMRV9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIxZDU3MGUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiLmgKQEAgLTAsMCArMSwxNTggQEAKKyNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKKyNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKKworLyoKKyAqIGxpbnV4L2J5dGVvcmRlci9zd2FiLmgKKyAqIEJ5dGUtc3dhcHBpbmcsIGluZGVwZW5kZW50bHkgZnJvbSBDUFUgZW5kaWFubmVzcworICoJc3dhYlhYW3BzXT8oZm9vKQorICoKKyAqIEZyYW5jb2lzLVJlbmUgUmlkZWF1IDxmYXJlQHR1bmVzLm9yZz4gMTk5NzEyMDUKKyAqICAgIHNlcGFyYXRlZCBzd2FiIGZ1bmN0aW9ucyBmcm9tIGNwdV90b19YWCwKKyAqICAgIHRvIGNsZWFuIHVwIHN1cHBvcnQgZm9yIGJpemFycmUtZW5kaWFuIGFyY2hpdGVjdHVyZXMuCisgKgorICogU2VlIGFzbS1pMzg2L2J5dGVvcmRlci5oIGFuZCBzdWNoZXMgZm9yIGV4YW1wbGVzIG9mIGhvdyB0byBwcm92aWRlCisgKiBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IG9wdGltaXplZCB2ZXJzaW9ucworICoKKyAqLworCisvKiBjYXN0cyBhcmUgbmVjZXNzYXJ5IGZvciBjb25zdGFudHMsIGJlY2F1c2Ugd2UgbmV2ZXIga25vdyBob3cgZm9yIHN1cmUKKyAqIGhvdyBVL1VML1VMTCBtYXAgdG8gX191MTYsIF9fdTMyLCBfX3U2NC4gQXQgbGVhc3Qgbm90IGluIGEgcG9ydGFibGUgd2F5LgorICovCisjZGVmaW5lIF9fX3N3YWIxNih4KSBcCisJKChfX3UxNikoIFwKKwkJKCgoX191MTYpKHgpICYgKF9fdTE2KTB4MDBmZlUpIDw8IDgpIHwgXAorCQkoKChfX3UxNikoeCkgJiAoX191MTYpMHhmZjAwVSkgPj4gOCkgKSkKKyNkZWZpbmUgX19fc3dhYjMyKHgpIFwKKwkoKF9fdTMyKSggXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCisJCSgoKF9fdTMyKSh4KSAmIChfX3UzMikweDAwMDBmZjAwVUwpIDw8ICA4KSB8IFwKKwkJKCgoX191MzIpKHgpICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gIDgpIHwgXAorCQkoKChfX3UzMikoeCkgJiAoX191MzIpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKKyNkZWZpbmUgX19fc3dhYjY0KHgpIFwKKwkoKF9fdTY0KSggXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwMDBmZlVMTCkgPDwgNTYpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMDAwZmYwMFVMTCkgPDwgNDApIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPDwgMjQpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwMDBmZjAwMDAwMFVMTCkgPDwgIDgpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMDAwZmYwMDAwMDAwMFVMTCkgPj4gIDgpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gMjQpIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4MDBmZjAwMDAwMDAwMDAwMFVMTCkgPj4gNDApIHwgXAorCQkoX191NjQpKCgoX191NjQpKHgpICYgKF9fdTY0KTB4ZmYwMDAwMDAwMDAwMDAwMFVMTCkgPj4gNTYpICkpCisKKy8qCisgKiBwcm92aWRlIGRlZmF1bHRzIHdoZW4gbm8gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIG9wdGltaXphdGlvbiBpcyBkZXRlY3RlZAorICovCisjaWZuZGVmIF9fYXJjaF9fc3dhYjE2CisjICBkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fc3dhYjE2KHgpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzIKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19zd2FiMzIoeCkKKyNlbmRpZgorI2lmbmRlZiBfX2FyY2hfX3N3YWI2NAorIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0KHgpIF9fX3N3YWI2NCh4KQorI2VuZGlmCisKKyNpZm5kZWYgX19hcmNoX19zd2FiMTZwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMTZwKHgpIF9fc3dhYjE2KCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzJwCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzJwKHgpIF9fc3dhYjMyKCooeCkpCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiNjRwCisjICBkZWZpbmUgX19hcmNoX19zd2FiNjRwKHgpIF9fc3dhYjY0KCooeCkpCisjZW5kaWYKKworI2lmbmRlZiBfX2FyY2hfX3N3YWIxNnMKKyMgIGRlZmluZSBfX2FyY2hfX3N3YWIxNnMoeCkgZG8geyAqKHgpID0gX19zd2FiMTZwKCh4KSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgX19hcmNoX19zd2FiMzJzCisjICBkZWZpbmUgX19hcmNoX19zd2FiMzJzKHgpIGRvIHsgKih4KSA9IF9fc3dhYjMycCgoeCkpOyB9IHdoaWxlICgwKQorI2VuZGlmCisjaWZuZGVmIF9fYXJjaF9fc3dhYjY0cworIyAgZGVmaW5lIF9fYXJjaF9fc3dhYjY0cyh4KSBkbyB7ICooeCkgPSBfX3N3YWI2NHAoKHgpKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qCisgKiBBbGxvdyBjb25zdGFudCBmb2xkaW5nCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPj0gMikgJiYgZGVmaW5lZChfX09QVElNSVpFX18pCisjICBkZWZpbmUgX19zd2FiMTYoeCkgXAorKF9fYnVpbHRpbl9jb25zdGFudF9wKChfX3UxNikoeCkpID8gXAorIF9fX3N3YWIxNigoeCkpIDogXAorIF9fZnN3YWIxNigoeCkpKQorIyAgZGVmaW5lIF9fc3dhYjMyKHgpIFwKKyhfX2J1aWx0aW5fY29uc3RhbnRfcCgoX191MzIpKHgpKSA/IFwKKyBfX19zd2FiMzIoKHgpKSA6IFwKKyBfX2Zzd2FiMzIoKHgpKSkKKyMgIGRlZmluZSBfX3N3YWI2NCh4KSBcCisoX19idWlsdGluX2NvbnN0YW50X3AoKF9fdTY0KSh4KSkgPyBcCisgX19fc3dhYjY0KCh4KSkgOiBcCisgX19mc3dhYjY0KCh4KSkpCisjZWxzZQorIyAgZGVmaW5lIF9fc3dhYjE2KHgpIF9fZnN3YWIxNih4KQorIyAgZGVmaW5lIF9fc3dhYjMyKHgpIF9fZnN3YWIzMih4KQorIyAgZGVmaW5lIF9fc3dhYjY0KHgpIF9fZnN3YWI2NCh4KQorI2VuZGlmIC8qIE9QVElNSVpFICovCisKKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3UxNiBfX2Zzd2FiMTYoX191MTYgeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMTYoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UxNiBfX3N3YWIxNnAoX191MTYgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjE2cCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMTZzKF9fdTE2ICphZGRyKQoreworCV9fYXJjaF9fc3dhYjE2cyhhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3UzMiBfX2Zzd2FiMzIoX191MzIgeCkKK3sKKwlyZXR1cm4gX19hcmNoX19zd2FiMzIoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWIzMnAoX191MzIgKngpCit7CisJcmV0dXJuIF9fYXJjaF9fc3dhYjMycCh4KTsKK30KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19zd2FiMzJzKF9fdTMyICphZGRyKQoreworCV9fYXJjaF9fc3dhYjMycyhhZGRyKTsKK30KKworI2lmZGVmIF9fQllURU9SREVSX0hBU19VNjRfXworc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfXygoY29uc3QpKSBfX3U2NCBfX2Zzd2FiNjQoX191NjQgeCkKK3sKKyMgIGlmZGVmIF9fU1dBQl82NF9USFJVXzMyX18KKwlfX3UzMiBoID0geCA+PiAzMjsKKwlfX3UzMiBsID0geCAmICgoMVVMTDw8MzIpLTEpOworCXJldHVybiAoKChfX3U2NClfX3N3YWIzMihsKSkgPDwgMzIpIHwgKChfX3U2NCkoX19zd2FiMzIoaCkpKTsKKyMgIGVsc2UKKwlyZXR1cm4gX19hcmNoX19zd2FiNjQoeCk7CisjICBlbmRpZgorfQorc3RhdGljIF9faW5saW5lX18gX191NjQgX19zd2FiNjRwKF9fdTY0ICp4KQoreworCXJldHVybiBfX2FyY2hfX3N3YWI2NHAoeCk7Cit9CitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhYjY0cyhfX3U2NCAqYWRkcikKK3sKKwlfX2FyY2hfX3N3YWI2NHMoYWRkcik7Cit9CisjZW5kaWYgLyogX19CWVRFT1JERVJfSEFTX1U2NF9fICovCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pCisjZGVmaW5lIHN3YWIxNiBfX3N3YWIxNgorI2RlZmluZSBzd2FiMzIgX19zd2FiMzIKKyNkZWZpbmUgc3dhYjY0IF9fc3dhYjY0CisjZGVmaW5lIHN3YWIxNnAgX19zd2FiMTZwCisjZGVmaW5lIHN3YWIzMnAgX19zd2FiMzJwCisjZGVmaW5lIHN3YWI2NHAgX19zd2FiNjRwCisjZGVmaW5lIHN3YWIxNnMgX19zd2FiMTZzCisjZGVmaW5lIHN3YWIzMnMgX19zd2FiMzJzCisjZGVmaW5lIHN3YWI2NHMgX19zd2FiNjRzCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9CWVRFT1JERVJfU1dBQl9IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2NvbmZpZy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE5NGNiCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9jb25maWcuaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX0xJTlVYX0NPTkZJR19ICisjZGVmaW5lIF9MSU5VWF9DT05GSUdfSAorCisvKiAjaW5jbHVkZSA8bGludXgvYXV0b2NvbmYuaD4gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2N0eXBlLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L2N0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhMzYzOQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvY3R5cGUuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9MSU5VWF9DVFlQRV9ICisjZGVmaW5lIF9MSU5VWF9DVFlQRV9ICisKKy8qCisgKiBOT1RFISBUaGlzIGN0eXBlIGRvZXMgbm90IGhhbmRsZSBFT0YgbGlrZSB0aGUgc3RhbmRhcmQgQworICogbGlicmFyeSBpcyByZXF1aXJlZCB0by4KKyAqLworCisjZGVmaW5lIF9VCTB4MDEJLyogdXBwZXIgKi8KKyNkZWZpbmUgX0wJMHgwMgkvKiBsb3dlciAqLworI2RlZmluZSBfRAkweDA0CS8qIGRpZ2l0ICovCisjZGVmaW5lIF9DCTB4MDgJLyogY250cmwgKi8KKyNkZWZpbmUgX1AJMHgxMAkvKiBwdW5jdCAqLworI2RlZmluZSBfUwkweDIwCS8qIHdoaXRlIHNwYWNlIChzcGFjZS9sZi90YWIpICovCisjZGVmaW5lIF9YCTB4NDAJLyogaGV4IGRpZ2l0ICovCisjZGVmaW5lIF9TUAkweDgwCS8qIGhhcmQgc3BhY2UgKDB4MjApICovCisKK2V4dGVybiB1bnNpZ25lZCBjaGFyIF9jdHlwZVtdOworCisjZGVmaW5lIF9faXNtYXNrKHgpIChfY3R5cGVbKGludCkodW5zaWduZWQgY2hhcikoeCldKQorCisjZGVmaW5lIGlzYWxudW0oYykJKChfX2lzbWFzayhjKSYoX1V8X0x8X0QpKSAhPSAwKQorI2RlZmluZSBpc2FscGhhKGMpCSgoX19pc21hc2soYykmKF9VfF9MKSkgIT0gMCkKKyNkZWZpbmUgaXNjbnRybChjKQkoKF9faXNtYXNrKGMpJihfQykpICE9IDApCisjZGVmaW5lIGlzZGlnaXQoYykJKChfX2lzbWFzayhjKSYoX0QpKSAhPSAwKQorI2RlZmluZSBpc2dyYXBoKGMpCSgoX19pc21hc2soYykmKF9QfF9VfF9MfF9EKSkgIT0gMCkKKyNkZWZpbmUgaXNsb3dlcihjKQkoKF9faXNtYXNrKGMpJihfTCkpICE9IDApCisjZGVmaW5lIGlzcHJpbnQoYykJKChfX2lzbWFzayhjKSYoX1B8X1V8X0x8X0R8X1NQKSkgIT0gMCkKKyNkZWZpbmUgaXNwdW5jdChjKQkoKF9faXNtYXNrKGMpJihfUCkpICE9IDApCisjZGVmaW5lIGlzc3BhY2UoYykJKChfX2lzbWFzayhjKSYoX1MpKSAhPSAwKQorI2RlZmluZSBpc3VwcGVyKGMpCSgoX19pc21hc2soYykmKF9VKSkgIT0gMCkKKyNkZWZpbmUgaXN4ZGlnaXQoYykJKChfX2lzbWFzayhjKSYoX0R8X1gpKSAhPSAwKQorCisjZGVmaW5lIGlzYXNjaWkoYykgKCgodW5zaWduZWQgY2hhcikoYykpPD0weDdmKQorI2RlZmluZSB0b2FzY2lpKGMpICgoKHVuc2lnbmVkIGNoYXIpKGMpKSYweDdmKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX190b2xvd2VyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXN1cHBlcihjKSkKKwkJYyAtPSAnQSctJ2EnOworCXJldHVybiBjOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX190b3VwcGVyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXNsb3dlcihjKSkKKwkJYyAtPSAnYSctJ0EnOworCXJldHVybiBjOworfQorCisjZGVmaW5lIHRvbG93ZXIoYykgX190b2xvd2VyKGMpCisjZGVmaW5lIHRvdXBwZXIoYykgX190b3VwcGVyKGMpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oIGIveC1sb2FkZXIvaW5jbHVkZS9saW51eC9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzdlMWYKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3Bvc2l4X3R5cGVzLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfTElOVVhfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfUE9TSVhfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisKKy8qCisgKiBUaGlzIGFsbG93cyBmb3IgMTAyNCBmaWxlIGRlc2NyaXB0b3JzOiBpZiBOUl9PUEVOIGlzIGV2ZXIgZ3Jvd24KKyAqIGJleW9uZCB0aGF0IHlvdSdsbCBoYXZlIHRvIGNoYW5nZSB0aGlzIHRvby4gQnV0IDEwMjQgZmQncyBzZWVtIHRvIGJlCisgKiBlbm91Z2ggZXZlbiBmb3Igc3VjaCAicmVhbCIgdW5pY2VzIGxpa2UgT1NGLzEsIHNvIGhvcGVmdWxseSB0aGlzIGlzCisgKiBvbmUgbGltaXQgdGhhdCBkb2Vzbid0IGhhdmUgdG8gYmUgY2hhbmdlZCBbYWdhaW5dLgorICoKKyAqIE5vdGUgdGhhdCBQT1NJWCB3YW50cyB0aGUgRkRfQ0xFQVIoZmQsZmRzZXRwKSBkZWZpbmVzIHRvIGJlIGluCisgKiA8c3lzL3RpbWUuaD4gKGFuZCB0aHVzIDxsaW51eC90aW1lLmg+KSAtIGJ1dCB0aGlzIGlzIGEgbW9yZSBsb2dpY2FsCisgKiBwbGFjZSBmb3IgdGhlbS4gU29sdmVkIGJ5IGhhdmluZyBkdW1teSBkZWZpbmVzIGluIDxzeXMvdGltZS5oPi4KKyAqLworCisvKgorICogVGhvc2UgbWFjcm9zIG1heSBoYXZlIGJlZW4gZGVmaW5lZCBpbiA8Z251L3R5cGVzLmg+LiBCdXQgd2UgYWx3YXlzCisgKiB1c2UgdGhlIG9uZXMgaGVyZS4KKyAqLworI3VuZGVmIF9fTkZEQklUUworI2RlZmluZSBfX05GREJJVFMJKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisKKyN1bmRlZiBfX0ZEX1NFVFNJWkUKKyNkZWZpbmUgX19GRF9TRVRTSVpFCTEwMjQKKworI3VuZGVmIF9fRkRTRVRfTE9OR1MKKyNkZWZpbmUgX19GRFNFVF9MT05HUwkoX19GRF9TRVRTSVpFL19fTkZEQklUUykKKworI3VuZGVmIF9fRkRFTFQKKyNkZWZpbmUJX19GREVMVChkKQkoKGQpIC8gX19ORkRCSVRTKQorCisjdW5kZWYgX19GRE1BU0sKKyNkZWZpbmUJX19GRE1BU0soZCkJKDFVTCA8PCAoKGQpICUgX19ORkRCSVRTKSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgZmRzX2JpdHMgW19fRkRTRVRfTE9OR1NdOworfSBfX2tlcm5lbF9mZF9zZXQ7CisKKy8qIFR5cGUgb2YgYSBzaWduYWwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKCpfX2tlcm5lbF9zaWdoYW5kbGVyX3QpKGludCk7CisKKy8qIFR5cGUgb2YgYSBTWVNWIElQQyBrZXkuICAqLwordHlwZWRlZiBpbnQgX19rZXJuZWxfa2V5X3Q7CisKKyNpbmNsdWRlIDxhc20vcG9zaXhfdHlwZXMuaD4KKworI2VuZGlmIC8qIF9MSU5VWF9QT1NJWF9UWVBFU19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0YXQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5NDIyY2IKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0YXQuaApAQCAtMCwwICsxLDEzMiBAQAorI2lmbmRlZiBfTElOVVhfU1RBVF9ICisjZGVmaW5lIF9MSU5VWF9TVEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBTX0lGTVQgIDAwMTcwMDAwCS8qIHR5cGUgb2YgZmlsZSAqLworI2RlZmluZSBTX0lGU09DSyAwMTQwMDAwCS8qIG5hbWVkIHNvY2tldCAqLworI2RlZmluZSBTX0lGTE5LCSAwMTIwMDAwCS8qIHN5bWJvbGljIGxpbmsgKi8KKyNkZWZpbmUgU19JRlJFRyAgMDEwMDAwMAkvKiByZWd1bGFyICovCisjZGVmaW5lIFNfSUZCTEsgIDAwNjAwMDAJLyogYmxvY2sgc3BlY2lhbCAqLworI2RlZmluZSBTX0lGRElSICAwMDQwMDAwCS8qIGRpcmVjdG9yeSAqLworI2RlZmluZSBTX0lGQ0hSICAwMDIwMDAwCS8qIGNoYXJhY3RlciBzcGVjaWFsICovCisjZGVmaW5lIFNfSUZJRk8gIDAwMTAwMDAJLyogZmlmbyAqLworI2RlZmluZSBTX0lTVUlEICAwMDA0MDAwCS8qIHNldCB1c2VyIGlkIG9uIGV4ZWN1dGlvbiAqLworI2RlZmluZSBTX0lTR0lEICAwMDAyMDAwCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUgU19JU1ZUWCAgMDAwMTAwMAkvKiBzYXZlIHN3YXBwZWQgdGV4dCBldmVuIGFmdGVyIHVzZSAqLworCisjZGVmaW5lIFNfSVNMTksobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZMTkspCisjZGVmaW5lIFNfSVNSRUcobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZGVmaW5lIFNfSVNESVIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZGVmaW5lIFNfSVNDSFIobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCisjZGVmaW5lIFNfSVNCTEsobSkJKCgobSkgJiBTX0lGTVQpID09IFNfSUZCTEspCisjZGVmaW5lIFNfSVNGSUZPKG0pCSgoKG0pICYgU19JRk1UKSA9PSBTX0lGSUZPKQorI2RlZmluZSBTX0lTU09DSyhtKQkoKChtKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCisKKyNkZWZpbmUgU19JUldYVSAwMDcwMAkJLyogcnd4IGZvciBvd25lciAqLworI2RlZmluZSBTX0lSVVNSIDAwNDAwCQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVdVU1IgMDAyMDAJCS8qIHdyaXRlIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisjZGVmaW5lIFNfSVhVU1IgMDAxMDAJCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24gZm9yIG93bmVyICovCisKKyNkZWZpbmUgU19JUldYRyAwMDA3MAkJLyogcnd4IGZvciBncm91cCAqLworI2RlZmluZSBTX0lSR1JQIDAwMDQwCQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVdHUlAgMDAwMjAJCS8qIHdyaXRlIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAJCS8qIGV4ZWN1dGUvc2VhcmNoIHBlcm1pc3Npb24gZm9yIGdyb3VwICovCisKKyNkZWZpbmUgU19JUldYTyAwMDAwNwkJLyogcnd4IGZvciBvdGhlciAqLworI2RlZmluZSBTX0lST1RIIDAwMDA0CQkvKiByZWFkIHBlcm1pc3Npb24gZm9yIG90aGVyICovCisjZGVmaW5lIFNfSVdPVEggMDAwMDIJCS8qIHJlYWQgcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKyNkZWZpbmUgU19JWE9USCAwMDAwMQkJLyogZXhlY3V0ZS9zZWFyY2ggcGVybWlzc2lvbiBmb3Igb3RoZXIgKi8KKworI2lmZGVmCV9fUFBDX18KKworc3RydWN0IHN0YXQgeworCWRldl90CQlzdF9kZXY7CQkvKiBmaWxlIHN5c3RlbSBpZCAqLworCWlub190CQlzdF9pbm87CQkvKiBmaWxlIGlkICovCisJbW9kZV90CQlzdF9tb2RlOwkvKiBvd25lcnNoaXAvcHJvdGVjdGlvbiAqLworCW5saW5rX3QJCXN0X25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgKi8KKwl1aWRfdCAJCXN0X3VpZDsJCS8qIHVzZXIgaWQgKi8KKwlnaWRfdCAJCXN0X2dpZDsJCS8qIGdyb3VwIGlkICovCisJZGV2X3QJCXN0X3JkZXY7CisJb2ZmX3QJCXN0X3NpemU7CS8qIGZpbGUgc2l6ZSBpbiAjIG9mIGJ5dGVzICovCisJdW5zaWduZWQgbG9uZyAgCXN0X2Jsa3NpemU7CS8qIGJsb2NrIHNpemUgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYmxvY2tzOwkvKiBmaWxlIHNpemUgaW4gIyBvZiBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nICAJc3RfYXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBhY2Nlc3NlZCAqLworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZyAgCXN0X210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgKi8KKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQyOworCXVuc2lnbmVkIGxvbmcgIAlzdF9jdGltZTsJLyogdGltZSBmaWxlIHN0YXR1cyB3YXMgbGFzdCBjaGFuZ2VkICovCisJdW5zaWduZWQgbG9uZyAgCV9fdW51c2VkMzsKKwl1bnNpZ25lZCBsb25nICAJX191bnVzZWQ0OworCXVuc2lnbmVkIGxvbmcgIAlfX3VudXNlZDU7Cit9OworCisjZW5kaWYJLyogX19QUENfXyAqLworCisjaWYgZGVmaW5lZCAoX19BUk1fXykgfHwgZGVmaW5lZCAoX19JMzg2X18pIHx8IGRlZmluZWQgKF9fTTY4S19fKSB8fCBkZWZpbmVkIChfX2JsYWNrZmluX18pCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7CisJdW5zaWduZWQgc2hvcnQgX19wYWQxOworCXVuc2lnbmVkIGxvbmcgc3RfaW5vOworCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7CisJdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7CisJdW5zaWduZWQgc2hvcnQgc3RfdWlkOworCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nICBzdF9tdGltZTsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWU7CisJdW5zaWduZWQgbG9uZyAgX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZW5kaWYJLyogX19BUk1fXyAqLworCisjaWYgZGVmaW5lZCAoX19NSVBTX18pCisKK3N0cnVjdCBzdGF0IHsKKwlkZXZfdCAgICAgICAgICAgc3RfZGV2OworCWxvbmcgICAgICAgICAgICBzdF9wYWQxWzNdOworCWlub190ICAgICAgICAgICBzdF9pbm87CisJbW9kZV90ICAgICAgICAgIHN0X21vZGU7CisJbmxpbmtfdCAgICAgICAgIHN0X25saW5rOworCXVpZF90ICAgICAgICAgICBzdF91aWQ7CisJZ2lkX3QgICAgICAgICAgIHN0X2dpZDsKKwlkZXZfdCAgICAgICAgICAgc3RfcmRldjsKKwlsb25nICAgICAgICAgICAgc3RfcGFkMlsyXTsKKwlvZmZfdCAgICAgICAgICAgc3Rfc2l6ZTsKKwlsb25nICAgICAgICAgICAgc3RfcGFkMzsKKwkvKgorCSAqIEFjdHVhbGx5IHRoaXMgc2hvdWxkIGJlIHRpbWVzdHJ1Y190IHN0X2F0aW1lLCBzdF9tdGltZSBhbmQgc3RfY3RpbWUKKwkgKiBidXQgd2UgZG9uJ3QgaGF2ZSBpdCB1bmRlciBMaW51eC4KKwkgKi8KKwl0aW1lX3QgICAgICAgICAgc3RfYXRpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMDsKKwl0aW1lX3QgICAgICAgICAgc3RfbXRpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMTsKKwl0aW1lX3QgICAgICAgICAgc3RfY3RpbWU7CisJbG9uZyAgICAgICAgICAgIHJlc2VydmVkMjsKKwlsb25nICAgICAgICAgICAgc3RfYmxrc2l6ZTsKKwlsb25nICAgICAgICAgICAgc3RfYmxvY2tzOworCWxvbmcgICAgICAgICAgICBzdF9wYWQ0WzE0XTsKK307CisKKyNlbmRpZgkvKiBfX01JUFNfXyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RkZGVmLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTM0YzIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX0xJTlVYX1NURERFRl9ICisjZGVmaW5lIF9MSU5VWF9TVERERUZfSAorCisjdW5kZWYgTlVMTAorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjZGVmaW5lIE5VTEwgMAorI2Vsc2UKKyNkZWZpbmUgTlVMTCAoKHZvaWQgKikwKQorI2VuZGlmCisKKyNpZm5kZWYgX1NJWkVfVAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjZW5kaWYKKworI3VuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChzaXplX3QpICYoKFRZUEUgKikwKS0+TUVNQkVSKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzkwMzkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC0wLDAgKzEsODkgQEAKKyNpZm5kZWYgX0xJTlVYX1NUUklOR19IXworI2RlZmluZSBfTElOVVhfU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBmb3Igc2l6ZV90ICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIGZvciBOVUxMICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKiBfX19zdHJ0b2s7CitleHRlcm4gY2hhciAqIHN0cnBicmsoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKik7CitleHRlcm4gY2hhciAqIHN0cnRvayhjaGFyICosY29uc3QgY2hhciAqKTsKK2V4dGVybiBjaGFyICogc3Ryc2VwKGNoYXIgKiosY29uc3QgY2hhciAqKTsKK2V4dGVybiBfX2tlcm5lbF9zaXplX3Qgc3Ryc3BuKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworCisKKy8qCisgKiBJbmNsdWRlIG1hY2hpbmUgc3BlY2lmaWMgaW5saW5lIHJvdXRpbmVzCisgKi8KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ1BZCitleHRlcm4gY2hhciAqIHN0cmNweShjaGFyICosY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ1BZCitleHRlcm4gY2hhciAqIHN0cm5jcHkoY2hhciAqLGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVQKK2V4dGVybiBjaGFyICogc3RyY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ0FUCitleHRlcm4gY2hhciAqIHN0cm5jYXQoY2hhciAqLCBjb25zdCBjaGFyICosIF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ01QCitleHRlcm4gaW50IHN0cmNtcChjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOQ01QCitleHRlcm4gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWYgMCAvKiBub3QgdXNlZCAtIHdhczogI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOSUNNUCAqLworZXh0ZXJuIGludCBzdHJuaWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDSFIKK2V4dGVybiBjaGFyICogc3RyY2hyKGNvbnN0IGNoYXIgKixpbnQpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlJDSFIKK2V4dGVybiBjaGFyICogc3RycmNocihjb25zdCBjaGFyICosaW50KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTVFIKK2V4dGVybiBjaGFyICogc3Ryc3RyKGNvbnN0IGNoYXIgKixjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkxFTgorZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqKTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJOTEVOCitleHRlcm4gX19rZXJuZWxfc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSRFVQCitleHRlcm4gY2hhciAqIHN0cmR1cChjb25zdCBjaGFyICopOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlNXQUIKK2V4dGVybiBjaGFyICogc3Ryc3dhYihjb25zdCBjaGFyICopOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUCitleHRlcm4gdm9pZCAqIG1lbXNldCh2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ1BZCitleHRlcm4gdm9pZCAqIG1lbWNweSh2b2lkICosY29uc3Qgdm9pZCAqLF9fa2VybmVsX3NpemVfdCk7CisjZW5kaWYKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNTU9WRQorZXh0ZXJuIHZvaWQgKiBtZW1tb3ZlKHZvaWQgKixjb25zdCB2b2lkICosX19rZXJuZWxfc2l6ZV90KTsKKyNlbmRpZgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TQ0FOCitleHRlcm4gdm9pZCAqIG1lbXNjYW4odm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNNUAorZXh0ZXJuIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKixfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTUNIUgorZXh0ZXJuIHZvaWQgKiBtZW1jaHIoY29uc3Qgdm9pZCAqLGludCxfX2tlcm5lbF9zaXplX3QpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfU1RSSU5HX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJmMTJiOTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMCwwICsxLDE1OCBAQAorI2lmbmRlZiBfTElOVVhfVElNRV9ICisjZGVmaW5lIF9MSU5VWF9USU1FX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgX0RFRlVOKGEsYixjKSBhKGMpCisjZGVmaW5lIF9DT05TVCBjb25zdAorI2RlZmluZSBfQU5EICwKKworI2RlZmluZSBfUkVFTlRfT05MWQorCisjZGVmaW5lIFNFQ1NQRVJNSU4JNjBMCisjZGVmaW5lIE1JTlNQRVJIT1VSCTYwTAorI2RlZmluZSBIT1VSU1BFUkRBWQkyNEwKKyNkZWZpbmUgU0VDU1BFUkhPVVIJKFNFQ1NQRVJNSU4gKiBNSU5TUEVSSE9VUikKKyNkZWZpbmUgU0VDU1BFUkRBWQkoU0VDU1BFUkhPVVIgKiBIT1VSU1BFUkRBWSkKKyNkZWZpbmUgREFZU1BFUldFRUsJNworI2RlZmluZSBNT05TUEVSWUVBUgkxMgorCisjZGVmaW5lIFlFQVJfQkFTRQkxOTAwCisjZGVmaW5lIEVQT0NIX1lFQVIgICAgICAxOTcwCisjZGVmaW5lIEVQT0NIX1dEQVkgICAgICA0CisKKyNkZWZpbmUgaXNsZWFwKHkpICgoKCh5KSAlIDQpID09IDAgJiYgKCh5KSAlIDEwMCkgIT0gMCkgfHwgKCh5KSAlIDQwMCkgPT0gMCkKKworCisvKiBVc2VkIGJ5IG90aGVyIHRpbWUgZnVuY3Rpb25zLiAgKi8KK3N0cnVjdCB0bSB7CisgICAgaW50IHRtX3NlYzsgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kcy4gICAgIFswLTYwXSAoMSBsZWFwIHNlY29uZCkgKi8KKyAgICBpbnQgdG1fbWluOyAgICAgICAgICAgICAgICAgICAvKiBNaW51dGVzLiAgICAgWzAtNTldICovCisgICAgaW50IHRtX2hvdXI7ICAgICAgICAgICAgICAgICAgLyogSG91cnMuICAgICAgIFswLTIzXSAqLworICAgIGludCB0bV9tZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheS4gICAgICAgICBbMS0zMV0gKi8KKyAgICBpbnQgdG1fbW9uOyAgICAgICAgICAgICAgICAgICAvKiBNb250aC4gICAgICAgWzAtMTFdICovCisgICAgaW50IHRtX3llYXI7ICAgICAgICAgICAgICAgICAgLyogWWVhciAtIDE5MDAuICAqLworICAgIGludCB0bV93ZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheSBvZiB3ZWVrLiBbMC02XSAqLworICAgIGludCB0bV95ZGF5OyAgICAgICAgICAgICAgICAgIC8qIERheXMgaW4geWVhci5bMC0zNjVdICovCisgICAgaW50IHRtX2lzZHN0OyAgICAgICAgICAgICAgICAgLyogRFNULiAgICAgICAgIFstMS8wLzFdKi8KKworIyBpZmRlZiBfX1VTRV9CU0QKKyAgICBsb25nIGludCB0bV9nbXRvZmY7ICAgICAgICAgICAvKiBTZWNvbmRzIGVhc3Qgb2YgVVRDLiAgKi8KKyAgICBfX2NvbnN0IGNoYXIgKnRtX3pvbmU7ICAgICAgICAvKiBUaW1lem9uZSBhYmJyZXZpYXRpb24uICAqLworIyBlbHNlCisgICAgbG9uZyBpbnQgX190bV9nbXRvZmY7ICAgICAgICAgLyogU2Vjb25kcyBlYXN0IG9mIFVUQy4gICovCisgICAgX19jb25zdCBjaGFyICpfX3RtX3pvbmU7ICAgICAgLyogVGltZXpvbmUgYWJicmV2aWF0aW9uLiAgKi8KKyMgZW5kaWYKK307CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitfREVGVU4gKGFzY3RpbWVfciwgKHRpbV9wLCByZXN1bHQpLAorCV9DT05TVCBzdHJ1Y3QgdG0gKnRpbV9wIF9BTkQKKwljaGFyICpyZXN1bHQpCit7CisgICAgc3RhdGljIF9DT05TVCBjaGFyIGRheV9uYW1lWzddWzNdID0geworCSJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiCisgICAgfTsKKyAgICBzdGF0aWMgX0NPTlNUIGNoYXIgbW9uX25hbWVbMTJdWzNdID0geworCSJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgorICAgIH07CisKKyAgICBzcHJpbnRmIChyZXN1bHQsICIlLjNzICUuM3MgJS4yZCAlLjJkOiUuMmQ6JS4yZCAlZFxuIiwKKwkgICAgZGF5X25hbWVbdGltX3AtPnRtX3dkYXldLAorCSAgICBtb25fbmFtZVt0aW1fcC0+dG1fbW9uXSwKKwkgICAgdGltX3AtPnRtX21kYXksIHRpbV9wLT50bV9ob3VyLCB0aW1fcC0+dG1fbWluLAorCSAgICB0aW1fcC0+dG1fc2VjLCAxOTAwICsgdGltX3AtPnRtX3llYXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRtICoKK19ERUZVTiAobG9jYWx0aW1lX3IsICh0aW1fcCwgcmVzKSwKKwlfQ09OU1QgdGltZV90ICogdGltX3AgX0FORAorCXN0cnVjdCB0bSAqcmVzKQoreworICAgIHN0YXRpYyBfQ09OU1QgaW50IG1vbl9sZW5ndGhzWzJdW01PTlNQRVJZRUFSXSA9IHsKKyAgICAgIHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfSwKKyAgICAgIHszMSwgMjksIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfQorICAgIH0gOworCisgICAgc3RhdGljIF9DT05TVCBpbnQgeWVhcl9sZW5ndGhzWzJdID0geworICAgICAgMzY1LAorICAgICAgMzY2CisgICAgfSA7CisKKyAgICBsb25nIGRheXMsIHJlbTsKKyAgICBpbnQgeTsKKyAgICBpbnQgeWxlYXA7CisgICAgX0NPTlNUIGludCAqaXA7CisKKyAgICBkYXlzID0gKChsb25nKSAqdGltX3ApIC8gU0VDU1BFUkRBWTsKKyAgICByZW0gPSAoKGxvbmcpICp0aW1fcCkgJSBTRUNTUEVSREFZOworICAgIHdoaWxlIChyZW0gPCAwKQorICAgIHsKKwlyZW0gKz0gU0VDU1BFUkRBWTsKKwktLWRheXM7CisgICAgfQorICAgIHdoaWxlIChyZW0gPj0gU0VDU1BFUkRBWSkKKyAgICB7CisJcmVtIC09IFNFQ1NQRVJEQVk7CisJKytkYXlzOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgaG91ciwgbWluLCBhbmQgc2VjICovCisgICAgcmVzLT50bV9ob3VyID0gKGludCkgKHJlbSAvIFNFQ1NQRVJIT1VSKTsKKyAgICByZW0gJT0gU0VDU1BFUkhPVVI7CisgICAgcmVzLT50bV9taW4gPSAoaW50KSAocmVtIC8gU0VDU1BFUk1JTik7CisgICAgcmVzLT50bV9zZWMgPSAoaW50KSAocmVtICUgU0VDU1BFUk1JTik7CisKKyAgICAvKiBjb21wdXRlIGRheSBvZiB3ZWVrICovCisgICAgaWYgKChyZXMtPnRtX3dkYXkgPSAoKEVQT0NIX1dEQVkgKyBkYXlzKSAlIERBWVNQRVJXRUVLKSkgPCAwKQorCXJlcy0+dG1fd2RheSArPSBEQVlTUEVSV0VFSzsKKworICAgIC8qIGNvbXB1dGUgeWVhciAmIGRheSBvZiB5ZWFyICovCisgICAgeSA9IEVQT0NIX1lFQVI7CisgICAgaWYgKGRheXMgPj0gMCkKKyAgICB7CisJZm9yICg7OykKKwl7CisJICAgIHlsZWFwID0gaXNsZWFwKHkpOworCSAgICBpZiAoZGF5cyA8IHllYXJfbGVuZ3Roc1t5bGVhcF0pCisJCWJyZWFrOworCSAgICB5Kys7CisJICAgIGRheXMgLT0geWVhcl9sZW5ndGhzW3lsZWFwXTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJZG8KKwl7CisJICAgIC0teTsKKwkgICAgeWxlYXAgPSBpc2xlYXAoeSk7CisJICAgIGRheXMgKz0geWVhcl9sZW5ndGhzW3lsZWFwXTsKKwl9IHdoaWxlIChkYXlzIDwgMCk7CisgICAgfQorCisgICAgcmVzLT50bV95ZWFyID0geSAtIFlFQVJfQkFTRTsKKyAgICByZXMtPnRtX3lkYXkgPSBkYXlzOworICAgIGlwID0gbW9uX2xlbmd0aHNbeWxlYXBdOworICAgIGZvciAocmVzLT50bV9tb24gPSAwOyBkYXlzID49IGlwW3Jlcy0+dG1fbW9uXTsgKytyZXMtPnRtX21vbikKKwlkYXlzIC09IGlwW3Jlcy0+dG1fbW9uXTsKKyAgICByZXMtPnRtX21kYXkgPSBkYXlzICsgMTsKKworICAgIC8qIHNldCBkYXlsaWdodCBzYXZpbmcgdGltZSBmbGFnICovCisgICAgcmVzLT50bV9pc2RzdCA9IC0xOworCisgICAgcmV0dXJuIChyZXMpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgorX0RFRlVOIChjdGltZV9yLCAodGltX3AsIHJlc3VsdCksCisJX0NPTlNUIHRpbWVfdCAqIHRpbV9wIF9BTkQKKwljaGFyICogcmVzdWx0KQorCit7CisgICAgc3RydWN0IHRtIHRtOworICAgIHJldHVybiBhc2N0aW1lX3IgKGxvY2FsdGltZV9yICh0aW1fcCwgJnRtKSwgcmVzdWx0KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi94LWxvYWRlci9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ODA4ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMCwwICsxLDEzMCBAQAorI2lmbmRlZiBfTElOVVhfVFlQRVNfSAorI2RlZmluZSBfTElOVVhfVFlQRVNfSAorCisjaWZkZWYJX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisjaWZuZGVmIF9fS0VSTkVMX1NUUklDVF9OQU1FUworCit0eXBlZGVmIF9fa2VybmVsX2ZkX3NldAkJZmRfc2V0OwordHlwZWRlZiBfX2tlcm5lbF9kZXZfdAkJZGV2X3Q7Cit0eXBlZGVmIF9fa2VybmVsX2lub190CQlpbm9fdDsKK3R5cGVkZWYgX19rZXJuZWxfbW9kZV90CQltb2RlX3Q7Cit0eXBlZGVmIF9fa2VybmVsX25saW5rX3QJbmxpbmtfdDsKK3R5cGVkZWYgX19rZXJuZWxfb2ZmX3QJCW9mZl90OwordHlwZWRlZiBfX2tlcm5lbF9waWRfdAkJcGlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX2RhZGRyX3QJZGFkZHJfdDsKK3R5cGVkZWYgX19rZXJuZWxfa2V5X3QJCWtleV90OwordHlwZWRlZiBfX2tlcm5lbF9zdXNlY29uZHNfdAlzdXNlY29uZHNfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KK3R5cGVkZWYgX19rZXJuZWxfdWlkMzJfdAl1aWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkMzJfdAlnaWRfdDsKK3R5cGVkZWYgX19rZXJuZWxfdWlkMTZfdCAgICAgICAgdWlkMTZfdDsKK3R5cGVkZWYgX19rZXJuZWxfZ2lkMTZfdCAgICAgICAgZ2lkMTZfdDsKKworI2lmZGVmIENPTkZJR19VSUQxNgorLyogVGhpcyBpcyBkZWZpbmVkIGJ5IGluY2x1ZGUvYXNtLXthcmNofS9wb3NpeF90eXBlcy5oICovCit0eXBlZGVmIF9fa2VybmVsX29sZF91aWRfdAlvbGRfdWlkX3Q7Cit0eXBlZGVmIF9fa2VybmVsX29sZF9naWRfdAlvbGRfZ2lkX3Q7CisjZW5kaWYgLyogQ09ORklHX1VJRDE2ICovCisKKy8qIGxpYmM1IGluY2x1ZGVzIHRoaXMgZmlsZSB0byBkZWZpbmUgdWlkX3QsIHRodXMgdWlkX3QgY2FuIG5ldmVyIGNoYW5nZQorICogd2hlbiBpdCBpcyBpbmNsdWRlZCBieSBub24ta2VybmVsIGNvZGUKKyAqLworI2Vsc2UKK3R5cGVkZWYgX19rZXJuZWxfdWlkX3QJCXVpZF90OwordHlwZWRlZiBfX2tlcm5lbF9naWRfdAkJZ2lkX3Q7CisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZiBfX2tlcm5lbF9sb2ZmX3QJCWxvZmZfdDsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgYWxzbyBwcm90ZWN0ZWQgYnkgaW5kaXZpZHVhbCBpZmRlZnMgZm9yCisgKiBoaXN0b3JpY2FsIHJlYXNvbnM6CisgKi8KKyNpZm5kZWYgX1NJWkVfVAorI2RlZmluZSBfU0laRV9UCit0eXBlZGVmIF9fa2VybmVsX3NpemVfdAkJc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1NTSVpFX1QKKyNkZWZpbmUgX1NTSVpFX1QKK3R5cGVkZWYgX19rZXJuZWxfc3NpemVfdAlzc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgX1BUUkRJRkZfVAorI2RlZmluZSBfUFRSRElGRl9UCit0eXBlZGVmIF9fa2VybmVsX3B0cmRpZmZfdAlwdHJkaWZmX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfVElNRV9UCisjZGVmaW5lIF9USU1FX1QKK3R5cGVkZWYgX19rZXJuZWxfdGltZV90CQl0aW1lX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0xPQ0tfVAorI2RlZmluZSBfQ0xPQ0tfVAordHlwZWRlZiBfX2tlcm5lbF9jbG9ja190CWNsb2NrX3Q7CisjZW5kaWYKKworI2lmbmRlZiBfQ0FERFJfVAorI2RlZmluZSBfQ0FERFJfVAordHlwZWRlZiBfX2tlcm5lbF9jYWRkcl90CWNhZGRyX3Q7CisjZW5kaWYKKworLyogYnNkICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVfY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJCXVfc2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdV9pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCXVfbG9uZzsKKworLyogc3lzdiAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1bmNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1c2hvcnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJdWludDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwkJdWxvbmc7CisKKyNpZm5kZWYgX19CSVRfVFlQRVNfREVGSU5FRF9fCisjZGVmaW5lIF9fQklUX1RZUEVTX0RFRklORURfXworCit0eXBlZGVmCQlfX3U4CQl1X2ludDhfdDsKK3R5cGVkZWYJCV9fczgJCWludDhfdDsKK3R5cGVkZWYJCV9fdTE2CQl1X2ludDE2X3Q7Cit0eXBlZGVmCQlfX3MxNgkJaW50MTZfdDsKK3R5cGVkZWYJCV9fdTMyCQl1X2ludDMyX3Q7Cit0eXBlZGVmCQlfX3MzMgkJaW50MzJfdDsKKworI2VuZGlmIC8qICEoX19CSVRfVFlQRVNfREVGSU5FRF9fKSAqLworCit0eXBlZGVmCQlfX3U4CQl1aW50OF90OwordHlwZWRlZgkJX191MTYJCXVpbnQxNl90OwordHlwZWRlZgkJX191MzIJCXVpbnQzMl90OworCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKQordHlwZWRlZgkJX191NjQJCXVpbnQ2NF90OwordHlwZWRlZgkJX191NjQJCXVfaW50NjRfdDsKK3R5cGVkZWYJCV9fczY0CQlpbnQ2NF90OworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgKi8KKworLyoKKyAqIEJlbG93IGFyZSB0cnVseSBMaW51eC1zcGVjaWZpYyB0eXBlcyB0aGF0IHNob3VsZCBuZXZlciBjb2xsaWRlIHdpdGgKKyAqIGFueSBhcHBsaWNhdGlvbi9saWJyYXJ5IHRoYXQgd2FudHMgbGludXgvdHlwZXMuaC4KKyAqLworCitzdHJ1Y3QgdXN0YXQgeworCV9fa2VybmVsX2RhZGRyX3QJZl90ZnJlZTsKKwlfX2tlcm5lbF9pbm9fdAkJZl90aW5vZGU7CisJY2hhcgkJCWZfZm5hbWVbNl07CisJY2hhcgkJCWZfZnBhY2tbNl07Cit9OworCisjZW5kaWYgLyogX0xJTlVYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbWFsbG9jLmggYi94LWxvYWRlci9pbmNsdWRlL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTU0YjAKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL21hbGxvYy5oCkBAIC0wLDAgKzEsOTQyIEBACisvKgorICBBIHZlcnNpb24gb2YgbWFsbG9jL2ZyZWUvcmVhbGxvYyB3cml0dGVuIGJ5IERvdWcgTGVhIGFuZCByZWxlYXNlZCB0byB0aGUKKyAgcHVibGljIGRvbWFpbi4gIFNlbmQgcXVlc3Rpb25zL2NvbW1lbnRzL2NvbXBsYWludHMvcGVyZm9ybWFuY2UgZGF0YQorICB0byBkbEBjcy5vc3dlZ28uZWR1CisKKyogVkVSU0lPTiAyLjYuNiAgU3VuIE1hciAgNSAxOToxMDowMyAyMDAwICBEb3VnIExlYSAgKGRsIGF0IGdlZSkKKworICAgTm90ZTogVGhlcmUgbWF5IGJlIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiB0aGlzIG1hbGxvYyBvYnRhaW5hYmxlIGF0CisJICAgZnRwOi8vZy5vc3dlZ28uZWR1L3B1Yi9taXNjL21hbGxvYy5jCisJIENoZWNrIGJlZm9yZSBpbnN0YWxsaW5nIQorCisqIFdoeSB1c2UgdGhpcyBtYWxsb2M/CisKKyAgVGhpcyBpcyBub3QgdGhlIGZhc3Rlc3QsIG1vc3Qgc3BhY2UtY29uc2VydmluZywgbW9zdCBwb3J0YWJsZSwgb3IKKyAgbW9zdCB0dW5hYmxlIG1hbGxvYyBldmVyIHdyaXR0ZW4uIEhvd2V2ZXIgaXQgaXMgYW1vbmcgdGhlIGZhc3Rlc3QKKyAgd2hpbGUgYWxzbyBiZWluZyBhbW9uZyB0aGUgbW9zdCBzcGFjZS1jb25zZXJ2aW5nLCBwb3J0YWJsZSBhbmQgdHVuYWJsZS4KKyAgQ29uc2lzdGVudCBiYWxhbmNlIGFjcm9zcyB0aGVzZSBmYWN0b3JzIHJlc3VsdHMgaW4gYSBnb29kIGdlbmVyYWwtcHVycG9zZQorICBhbGxvY2F0b3IuIEZvciBhIGhpZ2gtbGV2ZWwgZGVzY3JpcHRpb24sIHNlZQorICAgICBodHRwOi8vZy5vc3dlZ28uZWR1L2RsL2h0bWwvbWFsbG9jLmh0bWwKKworKiBTeW5vcHNpcyBvZiBwdWJsaWMgcm91dGluZXMKKworICAoTXVjaCBmdWxsZXIgZGVzY3JpcHRpb25zIGFyZSBjb250YWluZWQgaW4gdGhlIHByb2dyYW0gZG9jdW1lbnRhdGlvbiBiZWxvdy4pCisKKyAgbWFsbG9jKHNpemVfdCBuKTsKKyAgICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBjaHVuayBvZiBhdCBsZWFzdCBuIGJ5dGVzLCBvciBudWxsCisgICAgIGlmIG5vIHNwYWNlIGlzIGF2YWlsYWJsZS4KKyAgZnJlZShWb2lkX3QqIHApOworICAgICBSZWxlYXNlIHRoZSBjaHVuayBvZiBtZW1vcnkgcG9pbnRlZCB0byBieSBwLCBvciBubyBlZmZlY3QgaWYgcCBpcyBudWxsLgorICByZWFsbG9jKFZvaWRfdCogcCwgc2l6ZV90IG4pOworICAgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgY2h1bmsgb2Ygc2l6ZSBuIHRoYXQgY29udGFpbnMgdGhlIHNhbWUgZGF0YQorICAgICBhcyBkb2VzIGNodW5rIHAgdXAgdG8gdGhlIG1pbmltdW0gb2YgKG4sIHAncyBzaXplKSBieXRlcywgb3IgbnVsbAorICAgICBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUuIFRoZSByZXR1cm5lZCBwb2ludGVyIG1heSBvciBtYXkgbm90IGJlCisgICAgIHRoZSBzYW1lIGFzIHAuIElmIHAgaXMgbnVsbCwgZXF1aXZhbGVudCB0byBtYWxsb2MuICBVbmxlc3MgdGhlCisgICAgICNkZWZpbmUgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIGJlbG93IGlzIHNldCwgcmVhbGxvYyB3aXRoIGEKKyAgICAgc2l6ZSBhcmd1bWVudCBvZiB6ZXJvIChyZSlhbGxvY2F0ZXMgYSBtaW5pbXVtLXNpemVkIGNodW5rLgorICBtZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgbik7CisgICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY2h1bmsgb2YgbiBieXRlcywgYWxpZ25lZAorICAgICBpbiBhY2NvcmQgd2l0aCB0aGUgYWxpZ25tZW50IGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgcG93ZXIgb2YKKyAgICAgdHdvLgorICB2YWxsb2Moc2l6ZV90IG4pOworICAgICBFcXVpdmFsZW50IHRvIG1lbWFsaWduKHBhZ2VzaXplLCBuKSwgd2hlcmUgcGFnZXNpemUgaXMgdGhlIHBhZ2UKKyAgICAgc2l6ZSBvZiB0aGUgc3lzdGVtIChvciBhcyBuZWFyIHRvIHRoaXMgYXMgY2FuIGJlIGZpZ3VyZWQgb3V0IGZyb20KKyAgICAgYWxsIHRoZSBpbmNsdWRlcy9kZWZpbmVzIGJlbG93LikKKyAgcHZhbGxvYyhzaXplX3Qgbik7CisgICAgIEVxdWl2YWxlbnQgdG8gdmFsbG9jKG1pbmltdW0tcGFnZS10aGF0LWhvbGRzKG4pKSwgdGhhdCBpcywKKyAgICAgcm91bmQgdXAgbiB0byBuZWFyZXN0IHBhZ2VzaXplLgorICBjYWxsb2Moc2l6ZV90IHVuaXQsIHNpemVfdCBxdWFudGl0eSk7CisgICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHF1YW50aXR5ICogdW5pdCBieXRlcywgd2l0aCBhbGwgbG9jYXRpb25zCisgICAgIHNldCB0byB6ZXJvLgorICBjZnJlZShWb2lkX3QqIHApOworICAgICBFcXVpdmFsZW50IHRvIGZyZWUocCkuCisgIG1hbGxvY190cmltKHNpemVfdCBwYWQpOworICAgICBSZWxlYXNlIGFsbCBidXQgcGFkIGJ5dGVzIG9mIGZyZWVkIHRvcC1tb3N0IG1lbW9yeSBiYWNrCisgICAgIHRvIHRoZSBzeXN0ZW0uIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgMC4KKyAgbWFsbG9jX3VzYWJsZV9zaXplKFZvaWRfdCogcCk7CisgICAgIFJlcG9ydCB0aGUgbnVtYmVyIHVzYWJsZSBhbGxvY2F0ZWQgYnl0ZXMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRlZAorICAgICBjaHVuayBwLiBUaGlzIG1heSBvciBtYXkgbm90IHJlcG9ydCBtb3JlIGJ5dGVzIHRoYW4gd2VyZSByZXF1ZXN0ZWQsCisgICAgIGR1ZSB0byBhbGlnbm1lbnQgYW5kIG1pbmltdW0gc2l6ZSBjb25zdHJhaW50cy4KKyAgbWFsbG9jX3N0YXRzKCk7CisgICAgIFByaW50cyBicmllZiBzdW1tYXJ5IHN0YXRpc3RpY3Mgb24gc3RkZXJyLgorICBtYWxsaW5mbygpCisgICAgIFJldHVybnMgKGJ5IGNvcHkpIGEgc3RydWN0IGNvbnRhaW5pbmcgdmFyaW91cyBzdW1tYXJ5IHN0YXRpc3RpY3MuCisgIG1hbGxvcHQoaW50IHBhcmFtZXRlcl9udW1iZXIsIGludCBwYXJhbWV0ZXJfdmFsdWUpCisgICAgIENoYW5nZXMgb25lIG9mIHRoZSB0dW5hYmxlIHBhcmFtZXRlcnMgZGVzY3JpYmVkIGJlbG93LiBSZXR1cm5zCisgICAgIDEgaWYgc3VjY2Vzc2Z1bCBpbiBjaGFuZ2luZyB0aGUgcGFyYW1ldGVyLCBlbHNlIDAuCisKKyogVml0YWwgc3RhdGlzdGljczoKKworICBBbGlnbm1lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgtYnl0ZQorICAgICAgIDggYnl0ZSBhbGlnbm1lbnQgaXMgY3VycmVudGx5IGhhcmR3aXJlZCBpbnRvIHRoZSBkZXNpZ24uICBUaGlzCisgICAgICAgc2VlbXMgdG8gc3VmZmljZSBmb3IgYWxsIGN1cnJlbnQgbWFjaGluZXMgYW5kIEMgY29tcGlsZXJzLgorCisgIEFzc3VtZWQgcG9pbnRlciByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCisgICAgICAgQ29kZSBmb3IgOC1ieXRlIHBvaW50ZXJzIGlzIHVudGVzdGVkIGJ5IG1lIGJ1dCBoYXMgd29ya2VkCisgICAgICAgcmVsaWFibHkgYnkgV29sZnJhbSBHbG9nZXIsIHdobyBjb250cmlidXRlZCBtb3N0IG9mIHRoZQorICAgICAgIGNoYW5nZXMgc3VwcG9ydGluZyB0aGlzLgorCisgIEFzc3VtZWQgc2l6ZV90ICByZXByZXNlbnRhdGlvbjogICAgICAgNCBvciA4IGJ5dGVzCisgICAgICAgTm90ZSB0aGF0IHNpemVfdCBpcyBhbGxvd2VkIHRvIGJlIDQgYnl0ZXMgZXZlbiBpZiBwb2ludGVycyBhcmUgOC4KKworICBNaW5pbXVtIG92ZXJoZWFkIHBlciBhbGxvY2F0ZWQgY2h1bms6IDQgb3IgOCBieXRlcworICAgICAgIEVhY2ggbWFsbG9jZWQgY2h1bmsgaGFzIGEgaGlkZGVuIG92ZXJoZWFkIG9mIDQgYnl0ZXMgaG9sZGluZyBzaXplCisgICAgICAgYW5kIHN0YXR1cyBpbmZvcm1hdGlvbi4KKworICBNaW5pbXVtIGFsbG9jYXRlZCBzaXplOiA0LWJ5dGUgcHRyczogIDE2IGJ5dGVzICAgIChpbmNsdWRpbmcgNCBvdmVyaGVhZCkKKwkJCSAgOC1ieXRlIHB0cnM6ICAyNC8zMiBieXRlcyAoaW5jbHVkaW5nLCA0Lzggb3ZlcmhlYWQpCisKKyAgICAgICBXaGVuIGEgY2h1bmsgaXMgZnJlZWQsIDEyIChmb3IgNGJ5dGUgcHRycykgb3IgMjAgKGZvciA4IGJ5dGUKKyAgICAgICBwdHJzIGJ1dCA0IGJ5dGUgc2l6ZSkgb3IgMjQgKGZvciA4LzgpIGFkZGl0aW9uYWwgYnl0ZXMgYXJlCisgICAgICAgbmVlZGVkOyA0ICg4KSBmb3IgYSB0cmFpbGluZyBzaXplIGZpZWxkCisgICAgICAgYW5kIDggKDE2KSBieXRlcyBmb3IgZnJlZSBsaXN0IHBvaW50ZXJzLiBUaHVzLCB0aGUgbWluaW11bQorICAgICAgIGFsbG9jYXRhYmxlIHNpemUgaXMgMTYvMjQvMzIgYnl0ZXMuCisKKyAgICAgICBFdmVuIGEgcmVxdWVzdCBmb3IgemVybyBieXRlcyAoaS5lLiwgbWFsbG9jKDApKSByZXR1cm5zIGEKKyAgICAgICBwb2ludGVyIHRvIHNvbWV0aGluZyBvZiB0aGUgbWluaW11bSBhbGxvY2F0YWJsZSBzaXplLgorCisgIE1heGltdW0gYWxsb2NhdGVkIHNpemU6IDQtYnl0ZSBzaXplX3Q6IDJeMzEgLSAgOCBieXRlcworCQkJICA4LWJ5dGUgc2l6ZV90OiAyXjYzIC0gMTYgYnl0ZXMKKworICAgICAgIEl0IGlzIGFzc3VtZWQgdGhhdCAocG9zc2libHkgc2lnbmVkKSBzaXplX3QgYml0IHZhbHVlcyBzdWZmaWNlIHRvCisgICAgICAgcmVwcmVzZW50IGNodW5rIHNpemVzLiBgUG9zc2libHkgc2lnbmVkJyBpcyBkdWUgdG8gdGhlIGZhY3QKKyAgICAgICB0aGF0IGBzaXplX3QnIG1heSBiZSBkZWZpbmVkIG9uIGEgc3lzdGVtIGFzIGVpdGhlciBhIHNpZ25lZCBvcgorICAgICAgIGFuIHVuc2lnbmVkIHR5cGUuIFRvIGJlIGNvbnNlcnZhdGl2ZSwgdmFsdWVzIHRoYXQgd291bGQgYXBwZWFyCisgICAgICAgYXMgbmVnYXRpdmUgbnVtYmVycyBhcmUgYXZvaWRlZC4KKyAgICAgICBSZXF1ZXN0cyBmb3Igc2l6ZXMgd2l0aCBhIG5lZ2F0aXZlIHNpZ24gYml0IHdoZW4gdGhlIHJlcXVlc3QKKyAgICAgICBzaXplIGlzIHRyZWFkZWQgYXMgYSBsb25nIHdpbGwgcmV0dXJuIG51bGwuCisKKyAgTWF4aW11bSBvdmVyaGVhZCB3YXN0YWdlIHBlciBhbGxvY2F0ZWQgY2h1bms6IG5vcm1hbGx5IDE1IGJ5dGVzCisKKyAgICAgICBBbGlnbm5tZW50IGRlbWFuZHMsIHBsdXMgdGhlIG1pbmltdW0gYWxsb2NhdGFibGUgc2l6ZSByZXN0cmljdGlvbgorICAgICAgIG1ha2UgdGhlIG5vcm1hbCB3b3JzdC1jYXNlIHdhc3RhZ2UgMTUgYnl0ZXMgKGkuZS4sIHVwIHRvIDE1CisgICAgICAgbW9yZSBieXRlcyB3aWxsIGJlIGFsbG9jYXRlZCB0aGFuIHdlcmUgcmVxdWVzdGVkIGluIG1hbGxvYyksIHdpdGgKKyAgICAgICB0d28gZXhjZXB0aW9uczoKKwkgMS4gQmVjYXVzZSByZXF1ZXN0cyBmb3IgemVybyBieXRlcyBhbGxvY2F0ZSBub24temVybyBzcGFjZSwKKwkgICAgdGhlIHdvcnN0IGNhc2Ugd2FzdGFnZSBmb3IgYSByZXF1ZXN0IG9mIHplcm8gYnl0ZXMgaXMgMjQgYnl0ZXMuCisJIDIuIEZvciByZXF1ZXN0cyA+PSBtbWFwX3RocmVzaG9sZCB0aGF0IGFyZSBzZXJ2aWNlZCB2aWEKKwkgICAgbW1hcCgpLCB0aGUgd29yc3QgY2FzZSB3YXN0YWdlIGlzIDggYnl0ZXMgcGx1cyB0aGUgcmVtYWluZGVyCisJICAgIGZyb20gYSBzeXN0ZW0gcGFnZSAodGhlIG1pbmltYWwgbW1hcCB1bml0KTsgdHlwaWNhbGx5IDQwOTYgYnl0ZXMuCisKKyogTGltaXRhdGlvbnMKKworICAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcmUgTk9UIGN1cnJlbnRseSBzdXBwb3J0ZWQKKworICAgICogTm8gdXNlci1kZWZpbmFibGUgaG9va3MgZm9yIGNhbGxiYWNrcyBhbmQgdGhlIGxpa2UuCisgICAgKiBObyBhdXRvbWF0ZWQgbWVjaGFuaXNtIGZvciBmdWxseSBjaGVja2luZyB0aGF0IGFsbCBhY2Nlc3NlcworICAgICAgdG8gbWFsbG9jZWQgbWVtb3J5IHN0YXkgd2l0aGluIHRoZWlyIGJvdW5kcy4KKyAgICAqIE5vIHN1cHBvcnQgZm9yIGNvbXBhY3Rpb24uCisKKyogU3lub3BzaXMgb2YgY29tcGlsZS10aW1lIG9wdGlvbnM6CisKKyAgICBQZW9wbGUgaGF2ZSByZXBvcnRlZCB1c2luZyBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIG1hbGxvYyBvbiBhbGwKKyAgICB2ZXJzaW9ucyBvZiBVbml4LCBzb21ldGltZXMgYnkgdHdlYWtpbmcgc29tZSBvZiB0aGUgZGVmaW5lcworICAgIGJlbG93LiBJdCBoYXMgYmVlbiB0ZXN0ZWQgbW9zdCBleHRlbnNpdmVseSBvbiBTb2xhcmlzIGFuZAorICAgIExpbnV4LiBJdCBpcyBhbHNvIHJlcG9ydGVkIHRvIHdvcmsgb24gV0lOMzIgcGxhdGZvcm1zLgorICAgIFBlb3BsZSBoYXZlIGFsc28gcmVwb3J0ZWQgYWRhcHRpbmcgdGhpcyBtYWxsb2MgZm9yIHVzZSBpbgorICAgIHN0YW5kLWFsb25lIGVtYmVkZGVkIHN5c3RlbXMuCisKKyAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW4gc3RyYWlnaHQsIGhhbmQtdHVuZWQgQU5TSSBDLiAgQW1vbmcgb3RoZXIKKyAgICBjb25zZXF1ZW5jZXMsIGl0IHVzZXMgYSBsb3Qgb2YgbWFjcm9zLiAgQmVjYXVzZSBvZiB0aGlzLCB0byBiZSBhdAorICAgIGFsbCB1c2FibGUsIHRoaXMgY29kZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgYW4gb3B0aW1pemluZyBjb21waWxlcgorICAgIChmb3IgZXhhbXBsZSBnY2MgLU8yKSB0aGF0IGNhbiBzaW1wbGlmeSBleHByZXNzaW9ucyBhbmQgY29udHJvbAorICAgIHBhdGhzLgorCisgIF9fU1REX0MgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIEMgY29tcGlsZXIgZGVmaW5lcykKKyAgICAgTm9uemVybyBpZiB1c2luZyBBTlNJLXN0YW5kYXJkIEMgY29tcGlsZXIsIGEgQysrIGNvbXBpbGVyLCBvcgorICAgICBhIEMgY29tcGlsZXIgc3VmZmljaWVudGx5IGNsb3NlIHRvIEFOU0kgdG8gZ2V0IGF3YXkgd2l0aCBpdC4KKyAgREVCVUcgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBOT1QgZGVmaW5lZCkKKyAgICAgRGVmaW5lIHRvIGVuYWJsZSBkZWJ1Z2dpbmcuIEFkZHMgZmFpcmx5IGV4dGVuc2l2ZSBhc3NlcnRpb24tYmFzZWQKKyAgICAgY2hlY2tpbmcgdG8gaGVscCB0cmFjayBkb3duIG1lbW9yeSBlcnJvcnMsIGJ1dCBub3RpY2VhYmx5IHNsb3dzIGRvd24KKyAgICAgZXhlY3V0aW9uLgorICBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBEZWZpbmUgdGhpcyBpZiB5b3UgdGhpbmsgdGhhdCByZWFsbG9jKHAsIDApIHNob3VsZCBiZSBlcXVpdmFsZW50CisgICAgIHRvIGZyZWUocCkuIE90aGVyd2lzZSwgc2luY2UgbWFsbG9jIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IKKyAgICAgbWFsbG9jKDApLCBzbyBkb2VzIHJlYWxsb2MocCwgMCkuCisgIEhBVkVfTUVNQ1BZICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGRlZmluZWQpCisgICAgIERlZmluZSBpZiB5b3UgYXJlIG5vdCBvdGhlcndpc2UgdXNpbmcgQU5TSSBTVEQgQywgYnV0IHN0aWxsCisgICAgIGhhdmUgbWVtY3B5IGFuZCBtZW1zZXQgaW4geW91ciBDIGxpYnJhcnkgYW5kIHdhbnQgdG8gdXNlIHRoZW0uCisgICAgIE90aGVyd2lzZSwgc2ltcGxlIGludGVybmFsIHZlcnNpb25zIGFyZSBzdXBwbGllZC4KKyAgVVNFX01FTUNQWSAgICAgICAgICAgICAgIChkZWZhdWx0OiAxIGlmIEhBVkVfTUVNQ1BZIGlzIGRlZmluZWQsIDAgb3RoZXJ3aXNlKQorICAgICBEZWZpbmUgYXMgMSBpZiB5b3Ugd2FudCB0aGUgQyBsaWJyYXJ5IHZlcnNpb25zIG9mIG1lbXNldCBhbmQKKyAgICAgbWVtY3B5IGNhbGxlZCBpbiByZWFsbG9jIGFuZCBjYWxsb2MgKG90aGVyd2lzZSBtYWNybyB2ZXJzaW9ucyBhcmUgdXNlZCkuCisgICAgIEF0IGxlYXN0IG9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgc2ltcGxlIG1hY3JvIHZlcnNpb25zIHVzdWFsbHkKKyAgICAgb3V0cGVyZm9ybSBsaWJjIHZlcnNpb25zLgorICBIQVZFX01NQVAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZWZpbmVkIGFzIDEpCisgICAgIERlZmluZSB0byBub24temVybyB0byBvcHRpb25hbGx5IG1ha2UgbWFsbG9jKCkgdXNlIG1tYXAoKSB0bworICAgICBhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4KKyAgSEFWRV9NUkVNQVAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBkZWZpbmVkIGFzIDAgdW5sZXNzIExpbnV4IGxpYmMgc2V0KQorICAgICBEZWZpbmUgdG8gbm9uLXplcm8gdG8gb3B0aW9uYWxseSBtYWtlIHJlYWxsb2MoKSB1c2UgbXJlbWFwKCkgdG8KKyAgICAgcmVhbGxvY2F0ZSB2ZXJ5IGxhcmdlIGJsb2Nrcy4KKyAgbWFsbG9jX2dldHBhZ2VzaXplICAgICAgICAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIHN5c3RlbSAjaW5jbHVkZXMpCisgICAgIEVpdGhlciBhIGNvbnN0YW50IG9yIHJvdXRpbmUgY2FsbCByZXR1cm5pbmcgdGhlIHN5c3RlbSBwYWdlIHNpemUuCisgIEhBVkVfVVNSX0lOQ0xVREVfTUFMTE9DX0ggKGRlZmF1bHQ6IE5PVCBkZWZpbmVkKQorICAgICBPcHRpb25hbGx5IGRlZmluZSBpZiB5b3UgYXJlIG9uIGEgc3lzdGVtIHdpdGggYSAvdXNyL2luY2x1ZGUvbWFsbG9jLmgKKyAgICAgdGhhdCBkZWNsYXJlcyBzdHJ1Y3QgbWFsbGluZm8uIEl0IGlzIG5vdCBhdCBhbGwgbmVjZXNzYXJ5IHRvCisgICAgIGRlZmluZSB0aGlzIGV2ZW4gaWYgeW91IGRvLCBidXQgd2lsbCBlbnN1cmUgY29uc2lzdGVuY3kuCisgIElOVEVSTkFMX1NJWkVfVCAgICAgICAgICAgKGRlZmF1bHQ6IHNpemVfdCkKKyAgICAgRGVmaW5lIHRvIGEgMzItYml0IHR5cGUgKHByb2JhYmx5IGB1bnNpZ25lZCBpbnQnKSBpZiB5b3UgYXJlIG9uIGEKKyAgICAgNjQtYml0IG1hY2hpbmUsIHlldCBkbyBub3Qgd2FudCBvciBuZWVkIHRvIGFsbG93IG1hbGxvYyByZXF1ZXN0cyBvZgorICAgICBncmVhdGVyIHRoYW4gMl4zMSB0byBiZSBoYW5kbGVkLiBUaGlzIHNhdmVzIHNwYWNlLCBlc3BlY2lhbGx5IGZvcgorICAgICB2ZXJ5IHNtYWxsIGNodW5rcy4KKyAgSU5URVJOQUxfTElOVVhfQ19MSUIgICAgICAoZGVmYXVsdDogTk9UIGRlZmluZWQpCisgICAgIERlZmluZWQgb25seSB3aGVuIGNvbXBpbGVkIGFzIHBhcnQgb2YgTGludXggbGliYy4KKyAgICAgQWxzbyBub3RlIHRoYXQgdGhlcmUgaXMgc29tZSBvZGQgaW50ZXJuYWwgbmFtZS1tYW5nbGluZyB2aWEgZGVmaW5lcworICAgICAoZm9yIGV4YW1wbGUsIGludGVybmFsbHksIGBtYWxsb2MnIGlzIG5hbWVkIGBtQUxMT2MnKSBuZWVkZWQKKyAgICAgd2hlbiBjb21waWxpbmcgaW4gdGhpcyBjYXNlLiBUaGVzZSBsb29rIGZ1bm55IGJ1dCBkb24ndCBvdGhlcndpc2UKKyAgICAgYWZmZWN0IGFueXRoaW5nLgorICBXSU4zMiAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQpCisgICAgIERlZmluZSB0aGlzIG9uIE1TIHdpbiAoOTUsIG50KSBwbGF0Zm9ybXMgdG8gY29tcGlsZSBpbiBzYnJrIGVtdWxhdGlvbi4KKyAgTEFDS1NfVU5JU1REX0ggICAgICAgICAgICAoZGVmYXVsdDogdW5kZWZpbmVkIGlmIG5vdCBXSU4zMikKKyAgICAgRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIDx1bmlzdGQuaD4uCisgIExBQ0tTX1NZU19QQVJBTV9IICAgICAgICAgKGRlZmF1bHQ6IHVuZGVmaW5lZCBpZiBub3QgV0lOMzIpCisgICAgIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSA8c3lzL3BhcmFtLmg+LgorICBNT1JFQ09SRSAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBzYnJrKQorICAgICBUaGUgbmFtZSBvZiB0aGUgcm91dGluZSB0byBjYWxsIHRvIG9idGFpbiBtb3JlIG1lbW9yeSBmcm9tIHRoZSBzeXN0ZW0uCisgIE1PUkVDT1JFX0ZBSUxVUkUgICAgICAgICAgKGRlZmF1bHQ6IC0xKQorICAgICBUaGUgdmFsdWUgcmV0dXJuZWQgdXBvbiBmYWlsdXJlIG9mIE1PUkVDT1JFLgorICBNT1JFQ09SRV9DTEVBUlMgICAgICAgICAgIChkZWZhdWx0IDEpCisgICAgIFRydWUgKDEpIGlmIHRoZSByb3V0aW5lIG1hcHBlZCB0byBNT1JFQ09SRSB6ZXJvZXMgb3V0IG1lbW9yeSAod2hpY2gKKyAgICAgaG9sZHMgZm9yIHNicmspLgorICBERUZBVUxUX1RSSU1fVEhSRVNIT0xECisgIERFRkFVTFRfVE9QX1BBRAorICBERUZBVUxUX01NQVBfVEhSRVNIT0xECisgIERFRkFVTFRfTU1BUF9NQVgKKyAgICAgRGVmYXVsdCB2YWx1ZXMgb2YgdHVuYWJsZSBwYXJhbWV0ZXJzIChkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93KQorICAgICBjb250cm9sbGluZyBpbnRlcmFjdGlvbiB3aXRoIGhvc3Qgc3lzdGVtIHJvdXRpbmVzIChzYnJrLCBtbWFwLCBldGMpLgorICAgICBUaGVzZSB2YWx1ZXMgbWF5IGFsc28gYmUgY2hhbmdlZCBkeW5hbWljYWxseSB2aWEgbWFsbG9wdCgpLiBUaGUKKyAgICAgcHJlc2V0IGRlZmF1bHRzIGFyZSB0aG9zZSB0aGF0IGdpdmUgYmVzdCBwZXJmb3JtYW5jZSBmb3IgdHlwaWNhbAorICAgICBwcm9ncmFtcy9zeXN0ZW1zLgorICBVU0VfRExfUFJFRklYICAgICAgICAgICAgIChkZWZhdWx0OiB1bmRlZmluZWQpCisgICAgIFByZWZpeCBhbGwgcHVibGljIHJvdXRpbmVzIHdpdGggdGhlIHN0cmluZyAnZGwnLiAgVXNlZnVsIHRvCisgICAgIHF1aWNrbHkgYXZvaWQgcHJvY2VkdXJlIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyBhbmQgbGlua2VyIHN5bWJvbAorICAgICBjb25mbGljdHMgd2l0aCBleGlzdGluZyBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcy4KKworCisqLworCisMCisKKworLyogUHJlbGltaW5hcmllcyAqLworCisjaWZuZGVmIF9fU1REX0MKKyNpZmRlZiBfX1NURENfXworI2RlZmluZSBfX1NURF9DICAgICAxCisjZWxzZQorI2lmIF9fY3BsdXNwbHVzCisjZGVmaW5lIF9fU1REX0MgICAgIDEKKyNlbHNlCisjZGVmaW5lIF9fU1REX0MgICAgIDAKKyNlbmRpZiAvKl9fY3BsdXNwbHVzKi8KKyNlbmRpZiAvKl9fU1REQ19fKi8KKyNlbmRpZiAvKl9fU1REX0MqLworCisjaWZuZGVmIFZvaWRfdAorI2lmIChfX1NURF9DIHx8IGRlZmluZWQoV0lOMzIpKQorI2RlZmluZSBWb2lkX3QgICAgICB2b2lkCisjZWxzZQorI2RlZmluZSBWb2lkX3QgICAgICBjaGFyCisjZW5kaWYKKyNlbmRpZiAvKlZvaWRfdCovCisKKyNpZiBfX1NURF9DCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CS8qIGZvciBzaXplX3QgKi8KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYJLyogX19TVERfQyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCS8qIG5vdCBmb3IgVS1Cb290ICovCisjaW5jbHVkZSA8c3RkaW8uaD4JLyogbmVlZGVkIGZvciBtYWxsb2Nfc3RhdHMgKi8KKyNlbmRpZgorCisKKy8qCisgIENvbXBpbGUtdGltZSBvcHRpb25zCisqLworCisKKy8qCisgICAgRGVidWdnaW5nOgorCisgICAgQmVjYXVzZSBmcmVlZCBjaHVua3MgbWF5IGJlIG92ZXJ3cml0dGVuIHdpdGggbGluayBmaWVsZHMsIHRoaXMKKyAgICBtYWxsb2Mgd2lsbCBvZnRlbiBkaWUgd2hlbiBmcmVlZCBtZW1vcnkgaXMgb3ZlcndyaXR0ZW4gYnkgdXNlcgorICAgIHByb2dyYW1zLiAgVGhpcyBjYW4gYmUgdmVyeSBlZmZlY3RpdmUgKGFsYmVpdCBpbiBhbiBhbm5veWluZyB3YXkpCisgICAgaW4gaGVscGluZyB0cmFjayBkb3duIGRhbmdsaW5nIHBvaW50ZXJzLgorCisgICAgSWYgeW91IGNvbXBpbGUgd2l0aCAtRERFQlVHLCBhIG51bWJlciBvZiBhc3NlcnRpb24gY2hlY2tzIGFyZQorICAgIGVuYWJsZWQgdGhhdCB3aWxsIGNhdGNoIG1vcmUgbWVtb3J5IGVycm9ycy4gWW91IHByb2JhYmx5IHdvbid0IGJlCisgICAgYWJsZSB0byBtYWtlIG11Y2ggc2Vuc2Ugb2YgdGhlIGFjdHVhbCBhc3NlcnRpb24gZXJyb3JzLCBidXQgdGhleQorICAgIHNob3VsZCBoZWxwIHlvdSBsb2NhdGUgaW5jb3JyZWN0bHkgb3ZlcndyaXR0ZW4gbWVtb3J5LiAgVGhlCisgICAgY2hlY2tpbmcgaXMgZmFpcmx5IGV4dGVuc2l2ZSwgYW5kIHdpbGwgc2xvdyBkb3duIGV4ZWN1dGlvbgorICAgIG5vdGljZWFibHkuIENhbGxpbmcgbWFsbG9jX3N0YXRzIG9yIG1hbGxpbmZvIHdpdGggREVCVUcgc2V0IHdpbGwKKyAgICBhdHRlbXB0IHRvIGNoZWNrIGV2ZXJ5IG5vbi1tbWFwcGVkIGFsbG9jYXRlZCBhbmQgZnJlZSBjaHVuayBpbiB0aGUKKyAgICBjb3Vyc2Ugb2YgY29tcHV0aW5nIHRoZSBzdW1tbWFyaWVzLiAoQnkgbmF0dXJlLCBtbWFwcGVkIHJlZ2lvbnMKKyAgICBjYW5ub3QgYmUgY2hlY2tlZCB2ZXJ5IG11Y2ggYXV0b21hdGljYWxseS4pCisKKyAgICBTZXR0aW5nIERFQlVHIG1heSBhbHNvIGJlIGhlbHBmdWwgaWYgeW91IGFyZSB0cnlpbmcgdG8gbW9kaWZ5CisgICAgdGhpcyBjb2RlLiBUaGUgYXNzZXJ0aW9ucyBpbiB0aGUgY2hlY2sgcm91dGluZXMgc3BlbGwgb3V0IGluIG1vcmUKKyAgICBkZXRhaWwgdGhlIGFzc3VtcHRpb25zIGFuZCBpbnZhcmlhbnRzIHVuZGVybHlpbmcgdGhlIGFsZ29yaXRobXMuCisKKyovCisKKyNpZmRlZiBERUJVRworLyogI2luY2x1ZGUgPGFzc2VydC5oPiAqLworI2RlZmluZSBhc3NlcnQoeCkgKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBhc3NlcnQoeCkgKCh2b2lkKTApCisjZW5kaWYKKworCisvKgorICBJTlRFUk5BTF9TSVpFX1QgaXMgdGhlIHdvcmQtc2l6ZSB1c2VkIGZvciBpbnRlcm5hbCBib29ra2VlcGluZworICBvZiBjaHVuayBzaXplcy4gT24gYSA2NC1iaXQgbWFjaGluZSwgeW91IGNhbiByZWR1Y2UgbWFsbG9jCisgIG92ZXJoZWFkIGJ5IGRlZmluaW5nIElOVEVSTkFMX1NJWkVfVCB0byBiZSBhIDMyIGJpdCBgdW5zaWduZWQgaW50JworICBhdCB0aGUgZXhwZW5zZSBvZiBub3QgYmVpbmcgYWJsZSB0byBoYW5kbGUgcmVxdWVzdHMgZ3JlYXRlciB0aGFuCisgIDJeMzEuIFRoaXMgbGltaXRhdGlvbiBpcyBoYXJkbHkgZXZlciBhIGNvbmNlcm47IHlvdSBhcmUgZW5jb3VyYWdlZAorICB0byBzZXQgdGhpcy4gSG93ZXZlciwgdGhlIGRlZmF1bHQgdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyBzaXplX3QuCisqLworCisjaWZuZGVmIElOVEVSTkFMX1NJWkVfVAorI2RlZmluZSBJTlRFUk5BTF9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyoKKyAgUkVBTExPQ19aRVJPX0JZVEVTX0ZSRUVTIHNob3VsZCBiZSBzZXQgaWYgYSBjYWxsIHRvCisgIHJlYWxsb2Mgd2l0aCB6ZXJvIGJ5dGVzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBhIGNhbGwgdG8gZnJlZS4KKyAgU29tZSBwZW9wbGUgdGhpbmsgaXQgc2hvdWxkLiBPdGhlcndpc2UsIHNpbmNlIHRoaXMgbWFsbG9jCisgIHJldHVybnMgYSB1bmlxdWUgcG9pbnRlciBmb3IgbWFsbG9jKDApLCBzbyBkb2VzIHJlYWxsb2MocCwgMCkuCisqLworCisKKy8qICAgI2RlZmluZSBSRUFMTE9DX1pFUk9fQllURVNfRlJFRVMgKi8KKworCisvKgorICBXSU4zMiBjYXVzZXMgYW4gZW11bGF0aW9uIG9mIHNicmsgdG8gYmUgY29tcGlsZWQgaW4KKyAgbW1hcC1iYXNlZCBvcHRpb25zIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBXSU4zMi4KKyovCisKKy8qICNkZWZpbmUgV0lOMzIgKi8KKyNpZmRlZiBXSU4zMgorI2RlZmluZSBNT1JFQ09SRSB3c2JyaworI2RlZmluZSBIQVZFX01NQVAgMAorCisjZGVmaW5lIExBQ0tTX1VOSVNURF9ICisjZGVmaW5lIExBQ0tTX1NZU19QQVJBTV9ICisKKy8qCisgIEluY2x1ZGUgJ3dpbmRvd3MuaCcgdG8gZ2V0IHRoZSBuZWNlc3NhcnkgZGVjbGFyYXRpb25zIGZvciB0aGUKKyAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZGF0YSBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcyB1c2VkIGluIHRoZSAnc2JyaycKKyAgZW11bGF0aW9uLgorCisgIERlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIHNvIHRoYXQgb25seSB0aGUgZXNzZW50aWFsIE1pY3Jvc29mdAorICBWaXN1YWwgQysrIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisqLworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKworLyoKKyAgSEFWRV9NRU1DUFkgc2hvdWxkIGJlIGRlZmluZWQgaWYgeW91IGFyZSBub3Qgb3RoZXJ3aXNlIHVzaW5nCisgIEFOU0kgU1REIEMsIGJ1dCBzdGlsbCBoYXZlIG1lbWNweSBhbmQgbWVtc2V0IGluIHlvdXIgQyBsaWJyYXJ5CisgIGFuZCB3YW50IHRvIHVzZSB0aGVtIGluIGNhbGxvYyBhbmQgcmVhbGxvYy4gT3RoZXJ3aXNlIHNpbXBsZQorICBtYWNybyB2ZXJzaW9ucyBhcmUgZGVmaW5lZCBoZXJlLgorCisgIFVTRV9NRU1DUFkgc2hvdWxkIGJlIGRlZmluZWQgYXMgMSBpZiB5b3UgYWN0dWFsbHkgd2FudCB0bworICBoYXZlIG1lbXNldCBhbmQgbWVtY3B5IGNhbGxlZC4gUGVvcGxlIHJlcG9ydCB0aGF0IHRoZSBtYWNybworICB2ZXJzaW9ucyBhcmUgb2Z0ZW4gZW5vdWdoIGZhc3RlciB0aGFuIGxpYmMgdmVyc2lvbnMgb24gbWFueQorICBzeXN0ZW1zIHRoYXQgaXQgaXMgYmV0dGVyIHRvIHVzZSB0aGVtLgorCisqLworCisjZGVmaW5lIEhBVkVfTUVNQ1BZCisKKyNpZm5kZWYgVVNFX01FTUNQWQorI2lmZGVmIEhBVkVfTUVNQ1BZCisjZGVmaW5lIFVTRV9NRU1DUFkgMQorI2Vsc2UKKyNkZWZpbmUgVVNFX01FTUNQWSAwCisjZW5kaWYKKyNlbmRpZgorCisjaWYgKF9fU1REX0MgfHwgZGVmaW5lZChIQVZFX01FTUNQWSkpCisKKyNpZiBfX1NURF9DCit2b2lkKiBtZW1zZXQodm9pZCosIGludCwgc2l6ZV90KTsKK3ZvaWQqIG1lbWNweSh2b2lkKiwgY29uc3Qgdm9pZCosIHNpemVfdCk7CisjZWxzZQorI2lmZGVmIFdJTjMyCisvKiBPbiBXaW4zMiBwbGF0Zm9ybXMsICdtZW1zZXQoKScgYW5kICdtZW1jcHkoKScgYXJlIGFscmVhZHkgZGVjbGFyZWQgaW4gKi8KKy8qICd3aW5kb3dzLmgnICovCisjZWxzZQorVm9pZF90KiBtZW1zZXQoKTsKK1ZvaWRfdCogbWVtY3B5KCk7CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBVU0VfTUVNQ1BZCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBvbmx5IGludm9rZWQgd2l0aCAoMm4rMSktbXVsdGlwbGVzIG9mCisgICBJTlRFUk5BTF9TSVpFX1QgdW5pdHMsIHdpdGggYSBwb3NpdGl2ZSBpbnRlZ2VyIG4uIFRoaXMgaXMgZXhwbG9pdGVkCisgICBmb3IgZmFzdCBpbmxpbmUgZXhlY3V0aW9uIHdoZW4gbiBpcyBzbWFsbC4gKi8KKworI2RlZmluZSBNQUxMT0NfWkVSTyhjaGFycCwgbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QgbXpzeiA9IChuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZihtenN6IDw9IDkqc2l6ZW9mKG16c3opKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElOVEVSTkFMX1NJWkVfVCogbXogPSAoSU5URVJOQUxfU0laRV9UKikgKGNoYXJwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKG16c3ogPj0gNSpzaXplb2YobXpzeikpIHsgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZihtenN6ID49IDcqc2l6ZW9mKG16c3opKSB7ICAgKm16KysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZihtenN6ID49IDkqc2l6ZW9mKG16c3opKSB7ICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16KysgPSAwOyB9fX0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbXorKyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICpteisrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm16ICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSBtZW1zZXQoKGNoYXJwKSwgMCwgbXpzeik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgTUFMTE9DX0NPUFkoZGVzdCxzcmMsbmJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UIG1jc3ogPSAobmJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYobWNzeiA8PSA5KnNpemVvZihtY3N6KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5BTF9TSVpFX1QqIG1jc3JjID0gKElOVEVSTkFMX1NJWkVfVCopIChzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5BTF9TSVpFX1QqIG1jZHN0ID0gKElOVEVSTkFMX1NJWkVfVCopIChkZXN0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZihtY3N6ID49IDUqc2l6ZW9mKG1jc3opKSB7ICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYobWNzeiA+PSA3KnNpemVvZihtY3N6KSkgeyAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJaWYobWNzeiA+PSA5KnNpemVvZihtY3N6KSkgeyAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCsrID0gKm1jc3JjKys7IH19fSAgICAgICAgICAgICAgICAgXAorCQkJCSAgICAgKm1jZHN0KysgPSAqbWNzcmMrKzsgICAgICAgICAgICAgICAgICAgICBcCisJCQkJICAgICAqbWNkc3QrKyA9ICptY3NyYysrOyAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkgICAgICptY2RzdCAgID0gKm1jc3JjICA7ICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgbWVtY3B5KGRlc3QsIHNyYywgbWNzeik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZWxzZSAvKiAhVVNFX01FTUNQWSAqLworCisvKiBVc2UgRHVmZidzIGRldmljZSBmb3IgZ29vZCB6ZXJvaW5nL2NvcHlpbmcgcGVyZm9ybWFuY2UuICovCisKKyNkZWZpbmUgTUFMTE9DX1pFUk8oY2hhcnAsIG5ieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5URVJOQUxfU0laRV9UKiBtenAgPSAoSU5URVJOQUxfU0laRV9UKikoY2hhcnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbG9uZyBtY3RtcCA9IChuYnl0ZXMpL3NpemVvZihJTlRFUk5BTF9TSVpFX1QpLCBtY247ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKG1jdG1wIDwgOCkgbWNuID0gMDsgZWxzZSB7IG1jbiA9IChtY3RtcC0xKS84OyBtY3RtcCAlPSA4OyB9ICAgICAgICAgICAgIFwKKyAgc3dpdGNoIChtY3RtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IGZvcig7OykgeyAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDc6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDY6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDU6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDQ6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDM6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6ICAgICAgICAgICAqbXpwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDE6ICAgICAgICAgICAqbXpwKysgPSAwOyBpZihtY24gPD0gMCkgYnJlYWs7IG1jbi0tOyB9ICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBNQUxMT0NfQ09QWShkZXN0LHNyYyxuYnl0ZXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG1jc3JjID0gKElOVEVSTkFMX1NJWkVfVCopIHNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlRFUk5BTF9TSVpFX1QqIG1jZHN0ID0gKElOVEVSTkFMX1NJWkVfVCopIGRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsb25nIG1jdG1wID0gKG5ieXRlcykvc2l6ZW9mKElOVEVSTkFMX1NJWkVfVCksIG1jbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobWN0bXAgPCA4KSBtY24gPSAwOyBlbHNlIHsgbWNuID0gKG1jdG1wLTEpLzg7IG1jdG1wICU9IDg7IH0gICAgICAgICAgICAgXAorICBzd2l0Y2ggKG1jdG1wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMDogZm9yKDs7KSB7ICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNzogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNjogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNTogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgNDogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMzogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMjogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgMTogICAgICAgICAgICptY2RzdCsrID0gKm1jc3JjKys7IGlmKG1jbiA8PSAwKSBicmVhazsgbWNuLS07IH0gICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZW5kaWYKKworCisvKgorICBEZWZpbmUgSEFWRV9NTUFQIHRvIG9wdGlvbmFsbHkgbWFrZSBtYWxsb2MoKSB1c2UgbW1hcCgpIHRvCisgIGFsbG9jYXRlIHZlcnkgbGFyZ2UgYmxvY2tzLiAgVGhlc2Ugd2lsbCBiZSByZXR1cm5lZCB0byB0aGUKKyAgb3BlcmF0aW5nIHN5c3RlbSBpbW1lZGlhdGVseSBhZnRlciBhIGZyZWUoKS4KKyovCisKKy8qKioKKyNpZm5kZWYgSEFWRV9NTUFQCisjZGVmaW5lIEhBVkVfTU1BUCAxCisjZW5kaWYKKyoqKi8KKyN1bmRlZglIQVZFX01NQVAJLyogTm90IGF2YWlsYWJsZSBmb3IgVS1Cb290ICovCisKKy8qCisgIERlZmluZSBIQVZFX01SRU1BUCB0byBtYWtlIHJlYWxsb2MoKSB1c2UgbXJlbWFwKCkgdG8gcmUtYWxsb2NhdGUKKyAgbGFyZ2UgYmxvY2tzLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBwb3NzaWJsZSBvbiBMaW51eCB3aXRoCisgIGtlcm5lbCB2ZXJzaW9ucyBuZXdlciB0aGFuIDEuMy43Ny4KKyovCisKKy8qKioKKyNpZm5kZWYgSEFWRV9NUkVNQVAKKyNpZmRlZiBJTlRFUk5BTF9MSU5VWF9DX0xJQgorI2RlZmluZSBIQVZFX01SRU1BUCAxCisjZWxzZQorI2RlZmluZSBIQVZFX01SRU1BUCAwCisjZW5kaWYKKyNlbmRpZgorKioqLworI3VuZGVmCUhBVkVfTVJFTUFQCS8qIE5vdCBhdmFpbGFibGUgZm9yIFUtQm9vdCAqLworCisjaWYgSEFWRV9NTUFQCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZiAhZGVmaW5lZChNQVBfQU5PTllNT1VTKSAmJiBkZWZpbmVkKE1BUF9BTk9OKQorI2RlZmluZSBNQVBfQU5PTllNT1VTIE1BUF9BTk9OCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfTU1BUCAqLworCisvKgorICBBY2Nlc3MgdG8gc3lzdGVtIHBhZ2Ugc2l6ZS4gVG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhpcyBtYWxsb2MKKyAgbWFuYWdlcyBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGluIHBhZ2Utc2l6ZSB1bml0cy4KKworICBUaGUgZm9sbG93aW5nIG1lY2hhbmljcyBmb3IgZ2V0cGFnZXNpemUgd2VyZSBhZGFwdGVkIGZyb20KKyAgYnNkL2dudSBnZXRwYWdlc2l6ZS5oCisqLworCisjZGVmaW5lCUxBQ0tTX1VOSVNURF9ICS8qIFNob3J0Y3V0IGZvciBVLUJvb3QgKi8KKyNkZWZpbmUJbWFsbG9jX2dldHBhZ2VzaXplCTQwOTYKKworI2lmbmRlZiBMQUNLU19VTklTVERfSAorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmbmRlZiBtYWxsb2NfZ2V0cGFnZXNpemUKKyMgIGlmZGVmIF9TQ19QQUdFU0laRSAgICAgICAgIC8qIHNvbWUgU1ZSNCBzeXN0ZW1zIG9taXQgYW4gdW5kZXJzY29yZSAqLworIyAgICBpZm5kZWYgX1NDX1BBR0VfU0laRQorIyAgICAgIGRlZmluZSBfU0NfUEFHRV9TSVpFIF9TQ19QQUdFU0laRQorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmZGVmIF9TQ19QQUdFX1NJWkUKKyMgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpCisjICBlbHNlCisjICAgIGlmIGRlZmluZWQoQlNEKSB8fCBkZWZpbmVkKERHVVgpIHx8IGRlZmluZWQoSEFWRV9HRVRQQUdFU0laRSkKKyAgICAgICBleHRlcm4gc2l6ZV90IGdldHBhZ2VzaXplKCk7CisjICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSBnZXRwYWdlc2l6ZSgpCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBXSU4zMgorIyAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoNDA5NikgLyogVEJEOiBVc2UgJ0dldFN5c3RlbUluZm8nIGluc3RlYWQgKi8KKyMgICAgICBlbHNlCisjICAgICAgICBpZm5kZWYgTEFDS1NfU1lTX1BBUkFNX0gKKyMgICAgICAgICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgICAgICBlbmRpZgorIyAgICAgICAgaWZkZWYgRVhFQ19QQUdFU0laRQorIyAgICAgICAgICBkZWZpbmUgbWFsbG9jX2dldHBhZ2VzaXplIEVYRUNfUEFHRVNJWkUKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgaWZkZWYgTkJQRworIyAgICAgICAgICAgIGlmbmRlZiBDTFNJWkUKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQRworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgKE5CUEcgKiBDTFNJWkUpCisjICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgIGlmZGVmIE5CUEMKKyMgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgTkJQQworIyAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgIGlmZGVmIFBBR0VTSVpFCisjICAgICAgICAgICAgICAgIGRlZmluZSBtYWxsb2NfZ2V0cGFnZXNpemUgUEFHRVNJWkUKKyMgICAgICAgICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICAgZGVmaW5lIG1hbGxvY19nZXRwYWdlc2l6ZSAoNDA5NikgLyoganVzdCBndWVzcyAqLworIyAgICAgICAgICAgICAgZW5kaWYKKyMgICAgICAgICAgICBlbmRpZgorIyAgICAgICAgICBlbmRpZgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisKKy8qCisKKyAgVGhpcyB2ZXJzaW9uIG9mIG1hbGxvYyBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgU1ZJRC9YUEcgbWFsbGluZm8KKyAgcm91dGluZSB0aGF0IHJldHVybnMgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgc2FtZSBraW5kIG9mCisgIGluZm9ybWF0aW9uIHlvdSBjYW4gZ2V0IGZyb20gbWFsbG9jX3N0YXRzLiBJdCBzaG91bGQgd29yayBvbgorICBhbnkgU1ZJRC9YUEcgY29tcGxpYW50IHN5c3RlbSB0aGF0IGhhcyBhIC91c3IvaW5jbHVkZS9tYWxsb2MuaAorICBkZWZpbmluZyBzdHJ1Y3QgbWFsbGluZm8uIChJZiB5b3UnZCBsaWtlIHRvIGluc3RhbGwgc3VjaCBhIHRoaW5nCisgIHlvdXJzZWxmLCBjdXQgb3V0IHRoZSBwcmVsaW1pbmFyeSBkZWNsYXJhdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlCisgIGFuZCBiZWxvdyBhbmQgc2F2ZSB0aGVtIGluIGEgbWFsbG9jLmggZmlsZS4gQnV0IHRoZXJlJ3Mgbm8KKyAgY29tcGVsbGluZyByZWFzb24gdG8gYm90aGVyIHRvIGRvIHRoaXMuKQorCisgIFRoZSBtYWluIGRlY2xhcmF0aW9uIG5lZWRlZCBpcyB0aGUgbWFsbGluZm8gc3RydWN0IHRoYXQgaXMgcmV0dXJuZWQKKyAgKGJ5LWNvcHkpIGJ5IG1hbGxpbmZvKCkuICBUaGUgU1ZJRC9YUEcgbWFsbG9pbmZvIHN0cnVjdCBjb250YWlucyBhCisgIGJ1bmNoIG9mIGZpZWxkcywgbW9zdCBvZiB3aGljaCBhcmUgbm90IGV2ZW4gbWVhbmluZ2Z1bCBpbiB0aGlzCisgIHZlcnNpb24gb2YgbWFsbG9jLiBTb21lIG9mIHRoZXNlIGZpZWxkcyBhcmUgYXJlIGluc3RlYWQgZmlsbGVkIGJ5CisgIG1hbGxpbmZvKCkgd2l0aCBvdGhlciBudW1iZXJzIHRoYXQgbWlnaHQgcG9zc2libHkgYmUgb2YgaW50ZXJlc3QuCisKKyAgSEFWRV9VU1JfSU5DTFVERV9NQUxMT0NfSCBzaG91bGQgYmUgc2V0IGlmIHlvdSBoYXZlIGEKKyAgL3Vzci9pbmNsdWRlL21hbGxvYy5oIGZpbGUgdGhhdCBpbmNsdWRlcyBhIGRlY2xhcmF0aW9uIG9mIHN0cnVjdAorICBtYWxsaW5mby4gIElmIHNvLCBpdCBpcyBpbmNsdWRlZDsgZWxzZSBhbiBTVklEMi9YUEcyIGNvbXBsaWFudAorICB2ZXJzaW9uIGlzIGRlY2xhcmVkIGJlbG93LiAgVGhlc2UgbXVzdCBiZSBwcmVjaXNlbHkgdGhlIHNhbWUgZm9yCisgIG1hbGxpbmZvKCkgdG8gd29yay4KKworKi8KKworLyogI2RlZmluZSBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19IICovCisKKyNpZiBIQVZFX1VTUl9JTkNMVURFX01BTExPQ19ICisjaW5jbHVkZSAiL3Vzci9pbmNsdWRlL21hbGxvYy5oIgorI2Vsc2UKKworLyogU1ZJRDIvWFBHIG1hbGxpbmZvIHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgbWFsbGluZm8geworICBpbnQgYXJlbmE7ICAgIC8qIHRvdGFsIHNwYWNlIGFsbG9jYXRlZCBmcm9tIHN5c3RlbSAqLworICBpbnQgb3JkYmxrczsgIC8qIG51bWJlciBvZiBub24taW51c2UgY2h1bmtzICovCisgIGludCBzbWJsa3M7ICAgLyogdW51c2VkIC0tIGFsd2F5cyB6ZXJvICovCisgIGludCBoYmxrczsgICAgLyogbnVtYmVyIG9mIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgaGJsa2hkOyAgIC8qIHRvdGFsIHNwYWNlIGluIG1tYXBwZWQgcmVnaW9ucyAqLworICBpbnQgdXNtYmxrczsgIC8qIHVudXNlZCAtLSBhbHdheXMgemVybyAqLworICBpbnQgZnNtYmxrczsgIC8qIHVudXNlZCAtLSBhbHdheXMgemVybyAqLworICBpbnQgdW9yZGJsa3M7IC8qIHRvdGFsIGFsbG9jYXRlZCBzcGFjZSAqLworICBpbnQgZm9yZGJsa3M7IC8qIHRvdGFsIG5vbi1pbnVzZSBzcGFjZSAqLworICBpbnQga2VlcGNvc3Q7IC8qIHRvcC1tb3N0LCByZWxlYXNhYmxlICh2aWEgbWFsbG9jX3RyaW0pIHNwYWNlICovCit9OworCisvKiBTVklEMi9YUEcgbWFsbG9wdCBvcHRpb25zICovCisKKyNkZWZpbmUgTV9NWEZBU1QgIDEgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisjZGVmaW5lIE1fTkxCTEtTICAyICAgIC8qIFVOVVNFRCBpbiB0aGlzIG1hbGxvYyAqLworI2RlZmluZSBNX0dSQUlOICAgMyAgICAvKiBVTlVTRUQgaW4gdGhpcyBtYWxsb2MgKi8KKyNkZWZpbmUgTV9LRUVQICAgIDQgICAgLyogVU5VU0VEIGluIHRoaXMgbWFsbG9jICovCisKKyNlbmRpZgorCisvKiBtYWxsb3B0IG9wdGlvbnMgdGhhdCBhY3R1YWxseSBkbyBzb21ldGhpbmcgKi8KKworI2RlZmluZSBNX1RSSU1fVEhSRVNIT0xEICAgIC0xCisjZGVmaW5lIE1fVE9QX1BBRCAgICAgICAgICAgLTIKKyNkZWZpbmUgTV9NTUFQX1RIUkVTSE9MRCAgICAtMworI2RlZmluZSBNX01NQVBfTUFYICAgICAgICAgIC00CisKKworI2lmbmRlZiBERUZBVUxUX1RSSU1fVEhSRVNIT0xECisjZGVmaW5lIERFRkFVTFRfVFJJTV9USFJFU0hPTEQgKDEyOCAqIDEwMjQpCisjZW5kaWYKKworLyoKKyAgICBNX1RSSU1fVEhSRVNIT0xEIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiB1bnVzZWQgdG9wLW1vc3QgbWVtb3J5CisgICAgICB0byBrZWVwIGJlZm9yZSByZWxlYXNpbmcgdmlhIG1hbGxvY190cmltIGluIGZyZWUoKS4KKworICAgICAgQXV0b21hdGljIHRyaW1taW5nIGlzIG1haW5seSB1c2VmdWwgaW4gbG9uZy1saXZlZCBwcm9ncmFtcy4KKyAgICAgIEJlY2F1c2UgdHJpbW1pbmcgdmlhIHNicmsgY2FuIGJlIHNsb3cgb24gc29tZSBzeXN0ZW1zLCBhbmQgY2FuCisgICAgICBzb21ldGltZXMgYmUgd2FzdGVmdWwgKGluIGNhc2VzIHdoZXJlIHByb2dyYW1zIGltbWVkaWF0ZWx5CisgICAgICBhZnRlcndhcmQgYWxsb2NhdGUgbW9yZSBsYXJnZSBjaHVua3MpIHRoZSB2YWx1ZSBzaG91bGQgYmUgaGlnaAorICAgICAgZW5vdWdoIHNvIHRoYXQgeW91ciBvdmVyYWxsIHN5c3RlbSBwZXJmb3JtYW5jZSB3b3VsZCBpbXByb3ZlIGJ5CisgICAgICByZWxlYXNpbmcuCisKKyAgICAgIFRoZSB0cmltIHRocmVzaG9sZCBhbmQgdGhlIG1tYXAgY29udHJvbCBwYXJhbWV0ZXJzIChzZWUgYmVsb3cpCisgICAgICBjYW4gYmUgdHJhZGVkIG9mZiB3aXRoIG9uZSBhbm90aGVyLiBUcmltbWluZyBhbmQgbW1hcHBpbmcgYXJlCisgICAgICB0d28gZGlmZmVyZW50IHdheXMgb2YgcmVsZWFzaW5nIHVudXNlZCBtZW1vcnkgYmFjayB0byB0aGUKKyAgICAgIHN5c3RlbS4gQmV0d2VlbiB0aGVzZSB0d28sIGl0IGlzIG9mdGVuIHBvc3NpYmxlIHRvIGtlZXAKKyAgICAgIHN5c3RlbS1sZXZlbCBkZW1hbmRzIG9mIGEgbG9uZy1saXZlZCBwcm9ncmFtIGRvd24gdG8gYSBiYXJlCisgICAgICBtaW5pbXVtLiBGb3IgZXhhbXBsZSwgaW4gb25lIHRlc3Qgc3VpdGUgb2Ygc2Vzc2lvbnMgbWVhc3VyaW5nCisgICAgICB0aGUgWEY4NiBYIHNlcnZlciBvbiBMaW51eCwgdXNpbmcgYSB0cmltIHRocmVzaG9sZCBvZiAxMjhLIGFuZCBhCisgICAgICBtbWFwIHRocmVzaG9sZCBvZiAxOTJLIGxlZCB0byBuZWFyLW1pbmltYWwgbG9uZyB0ZXJtIHJlc291cmNlCisgICAgICBjb25zdW1wdGlvbi4KKworICAgICAgSWYgeW91IGFyZSB1c2luZyB0aGlzIG1hbGxvYyBpbiBhIGxvbmctbGl2ZWQgcHJvZ3JhbSwgaXQgc2hvdWxkCisgICAgICBwYXkgdG8gZXhwZXJpbWVudCB3aXRoIHRoZXNlIHZhbHVlcy4gIEFzIGEgcm91Z2ggZ3VpZGUsIHlvdQorICAgICAgbWlnaHQgc2V0IHRvIGEgdmFsdWUgY2xvc2UgdG8gdGhlIGF2ZXJhZ2Ugc2l6ZSBvZiBhIHByb2Nlc3MKKyAgICAgIChwcm9ncmFtKSBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLiAgUmVsZWFzaW5nIHRoaXMgbXVjaCBtZW1vcnkKKyAgICAgIHdvdWxkIGFsbG93IHN1Y2ggYSBwcm9jZXNzIHRvIHJ1biBpbiBtZW1vcnkuICBHZW5lcmFsbHksIGl0J3MKKyAgICAgIHdvcnRoIGl0IHRvIHR1bmUgZm9yIHRyaW1taW5nIHJhdGhlciB0aGFtIG1lbW9yeSBtYXBwaW5nIHdoZW4gYQorICAgICAgcHJvZ3JhbSB1bmRlcmdvZXMgcGhhc2VzIHdoZXJlIHNldmVyYWwgbGFyZ2UgY2h1bmtzIGFyZQorICAgICAgYWxsb2NhdGVkIGFuZCByZWxlYXNlZCBpbiB3YXlzIHRoYXQgY2FuIHJldXNlIGVhY2ggb3RoZXIncworICAgICAgc3RvcmFnZSwgcGVyaGFwcyBtaXhlZCB3aXRoIHBoYXNlcyB3aGVyZSB0aGVyZSBhcmUgbm8gc3VjaAorICAgICAgY2h1bmtzIGF0IGFsbC4gIEFuZCBpbiB3ZWxsLWJlaGF2ZWQgbG9uZy1saXZlZCBwcm9ncmFtcywKKyAgICAgIGNvbnRyb2xsaW5nIHJlbGVhc2Ugb2YgbGFyZ2UgYmxvY2tzIHZpYSB0cmltbWluZyB2ZXJzdXMgbWFwcGluZworICAgICAgaXMgdXN1YWxseSBmYXN0ZXIuCisKKyAgICAgIEhvd2V2ZXIsIGluIG1vc3QgcHJvZ3JhbXMsIHRoZXNlIHBhcmFtZXRlcnMgc2VydmUgbWFpbmx5IGFzCisgICAgICBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIHN5c3RlbS1sZXZlbCBlZmZlY3RzIG9mIGNhcnJ5aW5nIGFyb3VuZAorICAgICAgbWFzc2l2ZSBhbW91bnRzIG9mIHVubmVlZGVkIG1lbW9yeS4gU2luY2UgZnJlcXVlbnQgY2FsbHMgdG8KKyAgICAgIHNicmssIG1tYXAsIGFuZCBtdW5tYXAgb3RoZXJ3aXNlIGRlZ3JhZGUgcGVyZm9ybWFuY2UsIHRoZSBkZWZhdWx0CisgICAgICBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gcmVsYXRpdmVseSBoaWdoIHZhbHVlcyB0aGF0IHNlcnZlIG9ubHkgYXMKKyAgICAgIHNhZmVndWFyZHMuCisKKyAgICAgIFRoZSBkZWZhdWx0IHRyaW0gdmFsdWUgaXMgaGlnaCBlbm91Z2ggdG8gY2F1c2UgdHJpbW1pbmcgb25seSBpbgorICAgICAgZmFpcmx5IGV4dHJlbWUgKGJ5IGN1cnJlbnQgbWVtb3J5IGNvbnN1bXB0aW9uIHN0YW5kYXJkcykgY2FzZXMuCisgICAgICBJdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBwYWdlIHNpemUgdG8gaGF2ZSBhbnkgdXNlZnVsIGVmZmVjdC4gIFRvCisgICAgICBkaXNhYmxlIHRyaW1taW5nIGNvbXBsZXRlbHksIHlvdSBjYW4gc2V0IHRvICh1bnNpZ25lZCBsb25nKSgtMSk7CisKKworKi8KKworCisjaWZuZGVmIERFRkFVTFRfVE9QX1BBRAorI2RlZmluZSBERUZBVUxUX1RPUF9QQUQgICAgICAgICgwKQorI2VuZGlmCisKKy8qCisgICAgTV9UT1BfUEFEIGlzIHRoZSBhbW91bnQgb2YgZXh0cmEgYHBhZGRpbmcnIHNwYWNlIHRvIGFsbG9jYXRlIG9yCisgICAgICByZXRhaW4gd2hlbmV2ZXIgc2JyayBpcyBjYWxsZWQuIEl0IGlzIHVzZWQgaW4gdHdvIHdheXMgaW50ZXJuYWxseToKKworICAgICAgKiBXaGVuIHNicmsgaXMgY2FsbGVkIHRvIGV4dGVuZCB0aGUgdG9wIG9mIHRoZSBhcmVuYSB0byBzYXRpc2Z5CisJYSBuZXcgbWFsbG9jIHJlcXVlc3QsIHRoaXMgbXVjaCBwYWRkaW5nIGlzIGFkZGVkIHRvIHRoZSBzYnJrCisJcmVxdWVzdC4KKworICAgICAgKiBXaGVuIG1hbGxvY190cmltIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGZyb20gZnJlZSgpLAorCWl0IGlzIHVzZWQgYXMgdGhlIGBwYWQnIGFyZ3VtZW50LgorCisgICAgICBJbiBib3RoIGNhc2VzLCB0aGUgYWN0dWFsIGFtb3VudCBvZiBwYWRkaW5nIGlzIHJvdW5kZWQKKyAgICAgIHNvIHRoYXQgdGhlIGVuZCBvZiB0aGUgYXJlbmEgaXMgYWx3YXlzIGEgc3lzdGVtIHBhZ2UgYm91bmRhcnkuCisKKyAgICAgIFRoZSBtYWluIHJlYXNvbiBmb3IgdXNpbmcgcGFkZGluZyBpcyB0byBhdm9pZCBjYWxsaW5nIHNicmsgc28KKyAgICAgIG9mdGVuLiBIYXZpbmcgZXZlbiBhIHNtYWxsIHBhZCBncmVhdGx5IHJlZHVjZXMgdGhlIGxpa2VsaWhvb2QKKyAgICAgIHRoYXQgbmVhcmx5IGV2ZXJ5IG1hbGxvYyByZXF1ZXN0IGR1cmluZyBwcm9ncmFtIHN0YXJ0LXVwIChvcgorICAgICAgYWZ0ZXIgdHJpbW1pbmcpIHdpbGwgaW52b2tlIHNicmssIHdoaWNoIG5lZWRsZXNzbHkgd2FzdGVzCisgICAgICB0aW1lLgorCisgICAgICBBdXRvbWF0aWMgcm91bmRpbmctdXAgdG8gcGFnZS1zaXplIHVuaXRzIGlzIG5vcm1hbGx5IHN1ZmZpY2llbnQKKyAgICAgIHRvIGF2b2lkIG1lYXN1cmFibGUgb3ZlcmhlYWQsIHNvIHRoZSBkZWZhdWx0IGlzIDAuICBIb3dldmVyLCBpbgorICAgICAgc3lzdGVtcyB3aGVyZSBzYnJrIGlzIHJlbGF0aXZlbHkgc2xvdywgaXQgY2FuIHBheSB0byBpbmNyZWFzZQorICAgICAgdGhpcyB2YWx1ZSwgYXQgdGhlIGV4cGVuc2Ugb2YgY2FycnlpbmcgYXJvdW5kIG1vcmUgbWVtb3J5IHRoYW4KKyAgICAgIHRoZSBwcm9ncmFtIG5lZWRzLgorCisqLworCisKKyNpZm5kZWYgREVGQVVMVF9NTUFQX1RIUkVTSE9MRAorI2RlZmluZSBERUZBVUxUX01NQVBfVEhSRVNIT0xEICgxMjggKiAxMDI0KQorI2VuZGlmCisKKy8qCisKKyAgICBNX01NQVBfVEhSRVNIT0xEIGlzIHRoZSByZXF1ZXN0IHNpemUgdGhyZXNob2xkIGZvciB1c2luZyBtbWFwKCkKKyAgICAgIHRvIHNlcnZpY2UgYSByZXF1ZXN0LiBSZXF1ZXN0cyBvZiBhdCBsZWFzdCB0aGlzIHNpemUgdGhhdCBjYW5ub3QKKyAgICAgIGJlIGFsbG9jYXRlZCB1c2luZyBhbHJlYWR5LWV4aXN0aW5nIHNwYWNlIHdpbGwgYmUgc2VydmljZWQgdmlhIG1tYXAuCisgICAgICAoSWYgZW5vdWdoIG5vcm1hbCBmcmVlZCBzcGFjZSBhbHJlYWR5IGV4aXN0cyBpdCBpcyB1c2VkIGluc3RlYWQuKQorCisgICAgICBVc2luZyBtbWFwIHNlZ3JlZ2F0ZXMgcmVsYXRpdmVseSBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5IHNvIHRoYXQKKyAgICAgIHRoZXkgY2FuIGJlIGluZGl2aWR1YWxseSBvYnRhaW5lZCBhbmQgcmVsZWFzZWQgZnJvbSB0aGUgaG9zdAorICAgICAgc3lzdGVtLiBBIHJlcXVlc3Qgc2VydmljZWQgdGhyb3VnaCBtbWFwIGlzIG5ldmVyIHJldXNlZCBieSBhbnkKKyAgICAgIG90aGVyIHJlcXVlc3QgKGF0IGxlYXN0IG5vdCBkaXJlY3RseTsgdGhlIHN5c3RlbSBtYXkganVzdCBzbworICAgICAgaGFwcGVuIHRvIHJlbWFwIHN1Y2Nlc3NpdmUgcmVxdWVzdHMgdG8gdGhlIHNhbWUgbG9jYXRpb25zKS4KKworICAgICAgU2VncmVnYXRpbmcgc3BhY2UgaW4gdGhpcyB3YXkgaGFzIHRoZSBiZW5lZml0IHRoYXQgbW1hcHBlZCBzcGFjZQorICAgICAgY2FuIEFMV0FZUyBiZSBpbmRpdmlkdWFsbHkgcmVsZWFzZWQgYmFjayB0byB0aGUgc3lzdGVtLCB3aGljaAorICAgICAgaGVscHMga2VlcCB0aGUgc3lzdGVtIGxldmVsIG1lbW9yeSBkZW1hbmRzIG9mIGEgbG9uZy1saXZlZAorICAgICAgcHJvZ3JhbSBsb3cuIE1hcHBlZCBtZW1vcnkgY2FuIG5ldmVyIGJlY29tZSBgbG9ja2VkJyBiZXR3ZWVuCisgICAgICBvdGhlciBjaHVua3MsIGFzIGNhbiBoYXBwZW4gd2l0aCBub3JtYWxseSBhbGxvY2F0ZWQgY2h1bmtzLCB3aGljaAorICAgICAgbWVuYXMgdGhhdCBldmVuIHRyaW1taW5nIHZpYSBtYWxsb2NfdHJpbSB3b3VsZCBub3QgcmVsZWFzZSB0aGVtLgorCisgICAgICBIb3dldmVyLCBpdCBoYXMgdGhlIGRpc2FkdmFudGFnZXMgdGhhdDoKKworCSAxLiBUaGUgc3BhY2UgY2Fubm90IGJlIHJlY2xhaW1lZCwgY29uc29saWRhdGVkLCBhbmQgdGhlbgorCSAgICB1c2VkIHRvIHNlcnZpY2UgbGF0ZXIgcmVxdWVzdHMsIGFzIGhhcHBlbnMgd2l0aCBub3JtYWwgY2h1bmtzLgorCSAyLiBJdCBjYW4gbGVhZCB0byBtb3JlIHdhc3RhZ2UgYmVjYXVzZSBvZiBtbWFwIHBhZ2UgYWxpZ25tZW50CisJICAgIHJlcXVpcmVtZW50cworCSAzLiBJdCBjYXVzZXMgbWFsbG9jIHBlcmZvcm1hbmNlIHRvIGJlIG1vcmUgZGVwZW5kZW50IG9uIGhvc3QKKwkgICAgc3lzdGVtIG1lbW9yeSBtYW5hZ2VtZW50IHN1cHBvcnQgcm91dGluZXMgd2hpY2ggbWF5IHZhcnkgaW4KKwkgICAgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBhbmQgbWF5IGltcG9zZSBhcmJpdHJhcnkKKwkgICAgbGltaXRhdGlvbnMuIEdlbmVyYWxseSwgc2VydmljaW5nIGEgcmVxdWVzdCB2aWEgbm9ybWFsCisJICAgIG1hbGxvYyBzdGVwcyBpcyBmYXN0ZXIgdGhhbiBnb2luZyB0aHJvdWdoIGEgc3lzdGVtJ3MgbW1hcC4KKworICAgICAgQWxsIHRvZ2V0aGVyLCB0aGVzZSBjb25zaWRlcmF0aW9ucyBzaG91bGQgbGVhZCB5b3UgdG8gdXNlIG1tYXAKKyAgICAgIG9ubHkgZm9yIHJlbGF0aXZlbHkgbGFyZ2UgcmVxdWVzdHMuCisKKworKi8KKworCisjaWZuZGVmIERFRkFVTFRfTU1BUF9NQVgKKyNpZiBIQVZFX01NQVAKKyNkZWZpbmUgREVGQVVMVF9NTUFQX01BWCAgICAgICAoNjQpCisjZWxzZQorI2RlZmluZSBERUZBVUxUX01NQVBfTUFYICAgICAgICgwKQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAgICBNX01NQVBfTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB0byBzaW11bHRhbmVvdXNseQorICAgICAgc2VydmljZSB1c2luZyBtbWFwLiBUaGlzIHBhcmFtZXRlciBleGlzdHMgYmVjYXVzZToKKworCSAxLiBTb21lIHN5c3RlbXMgaGF2ZSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGludGVybmFsIHRhYmxlcyBmb3IKKwkgICAgdXNlIGJ5IG1tYXAuCisJIDIuIEluIG1vc3Qgc3lzdGVtcywgb3ZlcnJlbGlhbmNlIG9uIG1tYXAgY2FuIGRlZ3JhZGUgb3ZlcmFsbAorCSAgICBwZXJmb3JtYW5jZS4KKwkgMy4gSWYgYSBwcm9ncmFtIGFsbG9jYXRlcyBtYW55IGxhcmdlIHJlZ2lvbnMsIGl0IGlzIHByb2JhYmx5CisJICAgIGJldHRlciBvZmYgdXNpbmcgbm9ybWFsIHNicmstYmFzZWQgYWxsb2NhdGlvbiByb3V0aW5lcyB0aGF0CisJICAgIGNhbiByZWNsYWltIGFuZCByZWFsbG9jYXRlIG5vcm1hbCBoZWFwIG1lbW9yeS4gVXNpbmcgYQorCSAgICBzbWFsbCB2YWx1ZSBhbGxvd3MgdHJhbnNpdGlvbiBpbnRvIHRoaXMgbW9kZSBhZnRlciB0aGUKKwkgICAgZmlyc3QgZmV3IGFsbG9jYXRpb25zLgorCisgICAgICBTZXR0aW5nIHRvIDAgZGlzYWJsZXMgYWxsIHVzZSBvZiBtbWFwLiAgSWYgSEFWRV9NTUFQIGlzIG5vdCBzZXQsCisgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAwLCBhbmQgYXR0ZW1wdHMgdG8gc2V0IGl0IHRvIG5vbi16ZXJvIHZhbHVlcworICAgICAgaW4gbWFsbG9wdCB3aWxsIGZhaWwuCisqLworCisKKy8qCisgICAgVVNFX0RMX1BSRUZJWCB3aWxsIHByZWZpeCBhbGwgcHVibGljIHJvdXRpbmVzIHdpdGggdGhlIHN0cmluZyAnZGwnLgorICAgICAgVXNlZnVsIHRvIHF1aWNrbHkgYXZvaWQgcHJvY2VkdXJlIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyBhbmQgbGlua2VyCisgICAgICBzeW1ib2wgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMuCisKKyovCisKKy8qICNkZWZpbmUgVVNFX0RMX1BSRUZJWCAqLworCisKKy8qCisKKyAgU3BlY2lhbCBkZWZpbmVzIGZvciBsaW51eCBsaWJjCisKKyAgRXhjZXB0IHdoZW4gY29tcGlsZWQgdXNpbmcgdGhlc2Ugc3BlY2lhbCBkZWZpbmVzIGZvciBMaW51eCBsaWJjCisgIHVzaW5nIHdlYWsgYWxpYXNlcywgdGhpcyBtYWxsb2MgaXMgTk9UIGRlc2lnbmVkIHRvIHdvcmsgaW4KKyAgbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbnMuICBObyBzZW1hcGhvcmVzIG9yIG90aGVyIGNvbmN1cnJlbmN5CisgIGNvbnRyb2wgYXJlIHByb3ZpZGVkIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIG1hbGxvYyBvciBmcmVlIGNhbGxzCisgIGRvbid0IHJ1biBhdCB0aGUgc2FtZSB0aW1lLCB3aGljaCBjb3VsZCBiZSBkaXNhc3Rlcm91cy4gQSBzaW5nbGUKKyAgc2VtYXBob3JlIGNvdWxkIGJlIHVzZWQgYWNyb3NzIG1hbGxvYywgcmVhbGxvYywgYW5kIGZyZWUgKHdoaWNoIGlzCisgIGVzc2VudGlhbGx5IHRoZSBlZmZlY3Qgb2YgdGhlIGxpbnV4IHdlYWsgYWxpYXMgYXBwcm9hY2gpLiBJdCB3b3VsZAorICBiZSBoYXJkIHRvIG9idGFpbiBmaW5lciBncmFudWxhcml0eS4KKworKi8KKworCisjaWZkZWYgSU5URVJOQUxfTElOVVhfQ19MSUIKKworI2lmIF9fU1REX0MKKworVm9pZF90ICogX19kZWZhdWx0X21vcmVjb3JlX2luaXQgKHB0cmRpZmZfdCk7CitWb2lkX3QgKigqX19tb3JlY29yZSkocHRyZGlmZl90KSA9IF9fZGVmYXVsdF9tb3JlY29yZV9pbml0OworCisjZWxzZQorCitWb2lkX3QgKiBfX2RlZmF1bHRfbW9yZWNvcmVfaW5pdCAoKTsKK1ZvaWRfdCAqKCpfX21vcmVjb3JlKSgpID0gX19kZWZhdWx0X21vcmVjb3JlX2luaXQ7CisKKyNlbmRpZgorCisjZGVmaW5lIE1PUkVDT1JFICgqX19tb3JlY29yZSkKKyNkZWZpbmUgTU9SRUNPUkVfRkFJTFVSRSAwCisjZGVmaW5lIE1PUkVDT1JFX0NMRUFSUyAxCisKKyNlbHNlIC8qIElOVEVSTkFMX0xJTlVYX0NfTElCICovCisKKyNpZiBfX1NURF9DCitleHRlcm4gVm9pZF90KiAgICAgc2JyayhwdHJkaWZmX3QpOworI2Vsc2UKK2V4dGVybiBWb2lkX3QqICAgICBzYnJrKCk7CisjZW5kaWYKKworI2lmbmRlZiBNT1JFQ09SRQorI2RlZmluZSBNT1JFQ09SRSBzYnJrCisjZW5kaWYKKworI2lmbmRlZiBNT1JFQ09SRV9GQUlMVVJFCisjZGVmaW5lIE1PUkVDT1JFX0ZBSUxVUkUgLTEKKyNlbmRpZgorCisjaWZuZGVmIE1PUkVDT1JFX0NMRUFSUworI2RlZmluZSBNT1JFQ09SRV9DTEVBUlMgMQorI2VuZGlmCisKKyNlbmRpZiAvKiBJTlRFUk5BTF9MSU5VWF9DX0xJQiAqLworCisjaWYgZGVmaW5lZChJTlRFUk5BTF9MSU5VWF9DX0xJQikgJiYgZGVmaW5lZChfX0VMRl9fKQorCisjZGVmaW5lIGNBTExPYwkJX19saWJjX2NhbGxvYworI2RlZmluZSBmUkVlCQlfX2xpYmNfZnJlZQorI2RlZmluZSBtQUxMT2MJCV9fbGliY19tYWxsb2MKKyNkZWZpbmUgbUVNQUxJR24JX19saWJjX21lbWFsaWduCisjZGVmaW5lIHJFQUxMT2MJCV9fbGliY19yZWFsbG9jCisjZGVmaW5lIHZBTExPYwkJX19saWJjX3ZhbGxvYworI2RlZmluZSBwdkFMTE9jCQlfX2xpYmNfcHZhbGxvYworI2RlZmluZSBtQUxMSU5GbwlfX2xpYmNfbWFsbGluZm8KKyNkZWZpbmUgbUFMTE9QdAkJX19saWJjX21hbGxvcHQKKworI3ByYWdtYSB3ZWFrIGNhbGxvYyA9IF9fbGliY19jYWxsb2MKKyNwcmFnbWEgd2VhayBmcmVlID0gX19saWJjX2ZyZWUKKyNwcmFnbWEgd2VhayBjZnJlZSA9IF9fbGliY19mcmVlCisjcHJhZ21hIHdlYWsgbWFsbG9jID0gX19saWJjX21hbGxvYworI3ByYWdtYSB3ZWFrIG1lbWFsaWduID0gX19saWJjX21lbWFsaWduCisjcHJhZ21hIHdlYWsgcmVhbGxvYyA9IF9fbGliY19yZWFsbG9jCisjcHJhZ21hIHdlYWsgdmFsbG9jID0gX19saWJjX3ZhbGxvYworI3ByYWdtYSB3ZWFrIHB2YWxsb2MgPSBfX2xpYmNfcHZhbGxvYworI3ByYWdtYSB3ZWFrIG1hbGxpbmZvID0gX19saWJjX21hbGxpbmZvCisjcHJhZ21hIHdlYWsgbWFsbG9wdCA9IF9fbGliY19tYWxsb3B0CisKKyNlbHNlCisKKyNpZmRlZiBVU0VfRExfUFJFRklYCisjZGVmaW5lIGNBTExPYwkJZGxjYWxsb2MKKyNkZWZpbmUgZlJFZQkJZGxmcmVlCisjZGVmaW5lIG1BTExPYwkJZGxtYWxsb2MKKyNkZWZpbmUgbUVNQUxJR24JZGxtZW1hbGlnbgorI2RlZmluZSByRUFMTE9jCQlkbHJlYWxsb2MKKyNkZWZpbmUgdkFMTE9jCQlkbHZhbGxvYworI2RlZmluZSBwdkFMTE9jCQlkbHB2YWxsb2MKKyNkZWZpbmUgbUFMTElORm8JZGxtYWxsaW5mbworI2RlZmluZSBtQUxMT1B0CQlkbG1hbGxvcHQKKyNlbHNlIC8qIFVTRV9ETF9QUkVGSVggKi8KKyNkZWZpbmUgY0FMTE9jCQljYWxsb2MKKyNkZWZpbmUgZlJFZQkJZnJlZQorI2RlZmluZSBtQUxMT2MJCW1hbGxvYworI2RlZmluZSBtRU1BTElHbgltZW1hbGlnbgorI2RlZmluZSByRUFMTE9jCQlyZWFsbG9jCisjZGVmaW5lIHZBTExPYwkJdmFsbG9jCisjZGVmaW5lIHB2QUxMT2MJCXB2YWxsb2MKKyNkZWZpbmUgbUFMTElORm8JbWFsbGluZm8KKyNkZWZpbmUgbUFMTE9QdAkJbWFsbG9wdAorI2VuZGlmIC8qIFVTRV9ETF9QUkVGSVggKi8KKworI2VuZGlmCisKKy8qIFB1YmxpYyByb3V0aW5lcyAqLworCisjaWYgX19TVERfQworCitWb2lkX3QqIG1BTExPYyhzaXplX3QpOwordm9pZCAgICBmUkVlKFZvaWRfdCopOworVm9pZF90KiByRUFMTE9jKFZvaWRfdCosIHNpemVfdCk7CitWb2lkX3QqIG1FTUFMSUduKHNpemVfdCwgc2l6ZV90KTsKK1ZvaWRfdCogdkFMTE9jKHNpemVfdCk7CitWb2lkX3QqIHB2QUxMT2Moc2l6ZV90KTsKK1ZvaWRfdCogY0FMTE9jKHNpemVfdCwgc2l6ZV90KTsKK3ZvaWQgICAgY2ZyZWUoVm9pZF90Kik7CitpbnQgICAgIG1hbGxvY190cmltKHNpemVfdCk7CitzaXplX3QgIG1hbGxvY191c2FibGVfc2l6ZShWb2lkX3QqKTsKK3ZvaWQgICAgbWFsbG9jX3N0YXRzKHZvaWQpOworaW50ICAgICBtQUxMT1B0KGludCwgaW50KTsKK3N0cnVjdCBtYWxsaW5mbyBtQUxMSU5Gbyh2b2lkKTsKKyNlbHNlCitWb2lkX3QqIG1BTExPYygpOwordm9pZCAgICBmUkVlKCk7CitWb2lkX3QqIHJFQUxMT2MoKTsKK1ZvaWRfdCogbUVNQUxJR24oKTsKK1ZvaWRfdCogdkFMTE9jKCk7CitWb2lkX3QqIHB2QUxMT2MoKTsKK1ZvaWRfdCogY0FMTE9jKCk7Cit2b2lkICAgIGNmcmVlKCk7CitpbnQgICAgIG1hbGxvY190cmltKCk7CitzaXplX3QgIG1hbGxvY191c2FibGVfc2l6ZSgpOwordm9pZCAgICBtYWxsb2Nfc3RhdHMoKTsKK2ludCAgICAgbUFMTE9QdCgpOworc3RydWN0IG1hbGxpbmZvIG1BTExJTkZvKCk7CisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK307ICAvKiBlbmQgb2YgZXh0ZXJuICJDIiAqLworI2VuZGlmCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL21tYy5oIGIveC1sb2FkZXIvaW5jbHVkZS9tbWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTJhOTA3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS9tbWMuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDMKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfTU1DX0hfCisjZGVmaW5lIF9NTUNfSF8KKworI2luY2x1ZGUgPHBhcnQuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL21tYy5oPgorCitpbnQgbW1jX2luaXQoaW50IHZlcmJvc2UpOworaW50IG1tY19yZWFkKHVuc2lnbmVkIGludCBzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNpemUpOworaW50IG1tY193cml0ZSh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGxvbmcgZHN0LCBpbnQgc2l6ZSk7CitpbnQgbW1jMmluZm8odW5zaWduZWQgaW50IGFkZHIpOworCitibG9ja19kZXZfZGVzY190ICptbWNfZ2V0X2RldihpbnQgZGV2KTsKKworI2VuZGlmIC8qIF9NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvbnMxNjU1MC5oIGIveC1sb2FkZXIvaW5jbHVkZS9uczE2NTUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkMmQ0MAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvbnMxNjU1MC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICpUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKiAgCisgKiBOUzE2NTUwIFNlcmlhbCBQb3J0CisgKiBvcmlnaW5hbGx5IGZyb20gbGludXggc291cmNlIChhcmNoL3BwYy9ib290L25zMTY1NTAuaCkKKyAqIG1vZGlmaWVkIHNsaWdodGx5IHRvCisgKiBoYXZlIGFkZHJlc3NlcyBhcyBvZmZzZXRzIGZyb20gQ0ZHX0lTQV9CQVNFCisgKiBhZGRlZCBhIGZldyBtb3JlIGRlZmluaXRpb25zCisgKiBhZGRlZCBwcm90b3R5cGVzIGZvciBuczE2NTUwLmMKKyAqIHJlZHVjZWQgbm8gb2YgY29tIHBvcnRzIHRvIDIKKyAqIG1vZGlmaWNhdGlvbnMgKGMpIFJvYiBUYXlsb3IsIEZseWluZyBQaWcgU3lzdGVtcy4gMjAwMC4KKyAqLworCisjaWYgKENGR19OUzE2NTUwX1JFR19TSVpFID09IDEpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgY2hhciByYnI7CQkvKiAwICovCisJdW5zaWduZWQgY2hhciBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgY2hhciBmY3I7CQkvKiAyICovCisJdW5zaWduZWQgY2hhciBsY3I7CQkvKiAzICovCisJdW5zaWduZWQgY2hhciBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgY2hhciBsc3I7CQkvKiA1ICovCisJdW5zaWduZWQgY2hhciBtc3I7CQkvKiA2ICovCisJdW5zaWduZWQgY2hhciBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSAyKQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIHNob3J0IHJicjsJCS8qIDAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpZXI7CQkvKiAxICovCisJdW5zaWduZWQgc2hvcnQgZmNyOwkJLyogMiAqLworCXVuc2lnbmVkIHNob3J0IGxjcjsJCS8qIDMgKi8KKwl1bnNpZ25lZCBzaG9ydCBtY3I7CQkvKiA0ICovCisJdW5zaWduZWQgc2hvcnQgbHNyOwkJLyogNSAqLworCXVuc2lnbmVkIHNob3J0IG1zcjsJCS8qIDYgKi8KKwl1bnNpZ25lZCBzaG9ydCBzY3I7CQkvKiA3ICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKyNlbGlmIChDRkdfTlMxNjU1MF9SRUdfU0laRSA9PSA0KQorc3RydWN0IE5TMTY1NTAgeworCXVuc2lnbmVkIGxvbmcgcmJyOwkJLyogMCAqLworCXVuc2lnbmVkIGxvbmcgaWVyOwkJLyogMSAqLworCXVuc2lnbmVkIGxvbmcgZmNyOwkJLyogMiAqLworCXVuc2lnbmVkIGxvbmcgbGNyOwkJLyogMyAqLworCXVuc2lnbmVkIGxvbmcgbWNyOwkJLyogNCAqLworCXVuc2lnbmVkIGxvbmcgbHNyOwkJLyogNSAqLworCXVuc2lnbmVkIGxvbmcgbXNyOwkJLyogNiAqLworCXVuc2lnbmVkIGxvbmcgc2NyOwkJLyogNyAqLworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisjZWxpZiAoQ0ZHX05TMTY1NTBfUkVHX1NJWkUgPT0gLTQpCitzdHJ1Y3QgTlMxNjU1MCB7CisJdW5zaWduZWQgY2hhciByYnI7CQkvKiAwICovCisJaW50IHBhZDE6MjQ7CisJdW5zaWduZWQgY2hhciBpZXI7CQkvKiAxICovCisJaW50IHBhZDI6MjQ7CisJdW5zaWduZWQgY2hhciBmY3I7CQkvKiAyICovCisJaW50IHBhZDM6MjQ7CisJdW5zaWduZWQgY2hhciBsY3I7CQkvKiAzICovCisJaW50IHBhZDQ6MjQ7CisJdW5zaWduZWQgY2hhciBtY3I7CQkvKiA0ICovCisJaW50IHBhZDU6MjQ7CisJdW5zaWduZWQgY2hhciBsc3I7CQkvKiA1ICovCisJaW50IHBhZDY6MjQ7CisJdW5zaWduZWQgY2hhciBtc3I7CQkvKiA2ICovCisJaW50IHBhZDc6MjQ7CisJdW5zaWduZWQgY2hhciBzY3I7CQkvKiA3ICovCisJaW50IHBhZDg6MjQ7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUCkKKwl1bnNpZ25lZCBjaGFyIG1kcjE7CQkvKiBtb2RlIHNlbGVjdCByZXNldCBUTDE2Qzc1MCovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT01BUDE1MTAKKwlpbnQgcGFkOToyNDsKKwl1bnNpZ25lZCBsb25nIHBhZFsxMF07CisJdW5zaWduZWQgY2hhciBvc2NfMTJtX3NlbDsKKwlpbnQgcGFkMTA6MjQ7CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworI2Vsc2UKKyNlcnJvciAiUGxlYXNlIGRlZmluZSBOUzE2NTUwIHJlZ2lzdGVycyBzaXplLiIKKyNlbmRpZgorCisjZGVmaW5lIHRociByYnIKKyNkZWZpbmUgaWlyIGZjcgorI2RlZmluZSBkbGwgcmJyCisjZGVmaW5lIGRsbSBpZXIKKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgTlMxNjU1MCAqTlMxNjU1MF90OworCisjZGVmaW5lIEZDUl9GSUZPX0VOICAgICAweDAxCQkvKiBGaWZvIGVuYWJsZSAqLworI2RlZmluZSBGQ1JfUlhTUiAgICAgICAgMHgwMgkJLyogUmVjZWl2ZXIgc29mdCByZXNldCAqLworI2RlZmluZSBGQ1JfVFhTUiAgICAgICAgMHgwNAkJLyogVHJhbnNtaXR0ZXIgc29mdCByZXNldCAqLworCisjZGVmaW5lIE1DUl9EVFIgICAgICAgICAweDAxCisjZGVmaW5lIE1DUl9SVFMgICAgICAgICAweDAyCisjZGVmaW5lIE1DUl9ETUFfRU4gICAgICAweDA0CisjZGVmaW5lIE1DUl9UWF9ERlIgICAgICAweDA4CisKKyNkZWZpbmUgTENSX1dMU19NU0sJMHgwMwkJLyogY2hhcmFjdGVyIGxlbmd0aCBzbGVjdCBtYXNrICovCisjZGVmaW5lIExDUl9XTFNfNQkweDAwCQkvKiA1IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfNgkweDAxCQkvKiA2IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfNwkweDAyCQkvKiA3IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9XTFNfOAkweDAzCQkvKiA4IGJpdCBjaGFyYWN0ZXIgbGVuZ3RoICovCisjZGVmaW5lIExDUl9TVEIJCTB4MDQJCS8qIE51bWJlciBvZiBzdG9wIEJpdHMsIG9mZiA9IDEsIG9uID0gMS41IG9yIDIpICovCisjZGVmaW5lIExDUl9QRU4JCTB4MDgJCS8qIFBhcml0eSBlbmVibGUgKi8KKyNkZWZpbmUgTENSX0VQUwkJMHgxMAkJLyogRXZlbiBQYXJpdHkgU2VsZWN0ICovCisjZGVmaW5lIExDUl9TVEtQCTB4MjAJCS8qIFN0aWNrIFBhcml0eSAqLworI2RlZmluZSBMQ1JfU0JSSwkweDQwCQkvKiBTZXQgQnJlYWsgKi8KKyNkZWZpbmUgTENSX0JLU0UJMHg4MAkJLyogQmFuayBzZWxlY3QgZW5hYmxlICovCisKKyNkZWZpbmUgTFNSX0RSCQkweDAxCQkvKiBEYXRhIHJlYWR5ICovCisjZGVmaW5lIExTUl9PRQkJMHgwMgkJLyogT3ZlcnJ1biAqLworI2RlZmluZSBMU1JfUEUJCTB4MDQJCS8qIFBhcml0eSBlcnJvciAqLworI2RlZmluZSBMU1JfRkUJCTB4MDgJCS8qIEZyYW1pbmcgZXJyb3IgKi8KKyNkZWZpbmUgTFNSX0JJCQkweDEwCQkvKiBCcmVhayAqLworI2RlZmluZSBMU1JfVEhSRQkweDIwCQkvKiBYbWl0IGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKi8KKyNkZWZpbmUgTFNSX1RFTVQJMHg0MAkJLyogWG1pdHRlciBlbXB0eSAqLworI2RlZmluZSBMU1JfRVJSCQkweDgwCQkvKiBFcnJvciAqLworCisjaWZkZWYgQ09ORklHX09NQVAxNTEwCisjZGVmaW5lIE9TQ18xMk1fU0VMCTB4MDEJCS8qIHNlbGVjdHMgNi41ICogY3VycmVudCBjbGsgZGl2ICovCisjZW5kaWYKKworLyogdXNlZnVsIGRlZmF1bHRzIGZvciBMQ1IgKi8KKyNkZWZpbmUgTENSXzhOMQkJMHgwMworCit2b2lkCU5TMTY1NTBfaW5pdCAgIChOUzE2NTUwX3QgY29tX3BvcnQsIGludCBiYXVkX2Rpdmlzb3IpOwordm9pZAlOUzE2NTUwX3B1dGMgICAoTlMxNjU1MF90IGNvbV9wb3J0LCBjaGFyIGMpOworY2hhcglOUzE2NTUwX2dldGMgICAoTlMxNjU1MF90IGNvbV9wb3J0KTsKK2ludAlOUzE2NTUwX3RzdGMgICAoTlMxNjU1MF90IGNvbV9wb3J0KTsKK3ZvaWQJTlMxNjU1MF9yZWluaXQgKE5TMTY1NTBfdCBjb21fcG9ydCwgaW50IGJhdWRfZGl2aXNvcik7CmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3BhcnQuaCBiL3gtbG9hZGVyL2luY2x1ZGUvcGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOGFhM2MKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9pbmNsdWRlL3BhcnQuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA0CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9QQVJUX0gKKyNkZWZpbmUgX1BBUlRfSAorI2luY2x1ZGUgPGlkZS5oPgorCit0eXBlZGVmIHN0cnVjdCBibG9ja19kZXZfZGVzYyB7CisJaW50CQlpZl90eXBlOwkvKiB0eXBlIG9mIHRoZSBpbnRlcmZhY2UgKi8KKwlpbnQJICAgICAgICBkZXY7CSAgCS8qIGRldmljZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyCXBhcnRfdHlwZTsgIAkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXVuc2lnbmVkIGNoYXIJdGFyZ2V0OwkJLyogdGFyZ2V0IFNDU0kgSUQgKi8KKwl1bnNpZ25lZCBjaGFyCWx1bjsJCS8qIHRhcmdldCBMVU4gKi8KKwl1bnNpZ25lZCBjaGFyCXR5cGU7CQkvKiBkZXZpY2UgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIJcmVtb3ZhYmxlOwkvKiByZW1vdmFibGUgZGV2aWNlICovCisjaWZkZWYgQ09ORklHX0xCQTQ4CisJdW5zaWduZWQgY2hhcglsYmE0ODsJCS8qIGRldmljZSBjYW4gdXNlIDQ4Yml0IGFkZHIgKEFUQS9BVEFQSSB2NykgKi8KKyNlbmRpZgorCWxiYWludF90CQlsYmE7CSAgCS8qIG51bWJlciBvZiBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nCWJsa3N6OwkJLyogYmxvY2sgc2l6ZSAqLworCXVuc2lnbmVkIGNoYXIJdmVuZG9yIFs0MCsxXTsgCS8qIElERSBtb2RlbCwgU0NTSSBWZW5kb3IgKi8KKwl1bnNpZ25lZCBjaGFyCXByb2R1Y3RbMjArMV07CS8qIElERSBTZXJpYWwgbm8sIFNDU0kgcHJvZHVjdCAqLworCXVuc2lnbmVkIGNoYXIJcmV2aXNpb25bOCsxXTsJLyogZmlybXdhcmUgcmV2aXNpb24gKi8KKwl1bnNpZ25lZCBsb25nCSgqYmxvY2tfcmVhZCkoaW50IGRldiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCSAgICAgIGxiYWludF90IGJsa2NudCwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nICpidWZmZXIpOworfWJsb2NrX2Rldl9kZXNjX3Q7CisKKy8qIEludGVyZmFjZSB0eXBlczogKi8KKyNkZWZpbmUgSUZfVFlQRV9VTktOT1dOCQkwCisjZGVmaW5lIElGX1RZUEVfSURFCQkxCisjZGVmaW5lIElGX1RZUEVfU0NTSQkJMgorI2RlZmluZSBJRl9UWVBFX0FUQVBJCQkzCisjZGVmaW5lIElGX1RZUEVfVVNCCQk0CisjZGVmaW5lIElGX1RZUEVfRE9DCQk1CisjZGVmaW5lIElGX1RZUEVfTU1DCQk2CisKKy8qIFBhcnQgdHlwZXMgKi8KKyNkZWZpbmUgUEFSVF9UWVBFX1VOS05PV04JMHgwMAorI2RlZmluZSBQQVJUX1RZUEVfTUFDCQkweDAxCisjZGVmaW5lIFBBUlRfVFlQRV9ET1MJCTB4MDIKKyNkZWZpbmUgUEFSVF9UWVBFX0lTTwkJMHgwMworI2RlZmluZSBQQVJUX1RZUEVfQU1JR0EJCTB4MDQKKworLyoKKyAqIFR5cGUgc3RyaW5nIGZvciBVLUJvb3QgYm9vdGFibGUgcGFydGl0aW9ucworICovCisjZGVmaW5lIEJPT1RfUEFSVF9UWVBFCSJVLUJvb3QiCS8qIHByaW1hcnkgYm9vdCBwYXJ0aXRpb24gdHlwZQkqLworI2RlZmluZSBCT09UX1BBUlRfQ09NUAkiUFBDQm9vdCIJLyogUFBDQm9vdCBjb21wYXRpYmlsaXR5IHR5cGUJKi8KKworLyogZGV2aWNlIHR5cGVzICovCisjZGVmaW5lIERFVl9UWVBFX1VOS05PV04JMHhmZgkvKiBub3QgY29ubmVjdGVkICovCisjZGVmaW5lIERFVl9UWVBFX0hBUkRESVNLCTB4MDAJLyogaGFyZGRpc2sgKi8KKyNkZWZpbmUgREVWX1RZUEVfVEFQRQkJMHgwMQkvKiBUYXBlICovCisjZGVmaW5lIERFVl9UWVBFX0NEUk9NCQkweDA1CS8qIENELVJPTSAqLworI2RlZmluZSBERVZfVFlQRV9PUERJU0sJCTB4MDcJLyogb3B0aWNhbCBkaXNrICovCisKK3R5cGVkZWYgc3RydWN0IGRpc2tfcGFydGl0aW9uIHsKKwl1bG9uZwlzdGFydDsJCS8qICMgb2YgZmlyc3QgYmxvY2sgaW4gcGFydGl0aW9uCSovCisJdWxvbmcJc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gcGFydGl0aW9uCSovCisJdWxvbmcJYmxrc3o7CQkvKiBibG9jayBzaXplIGluIGJ5dGVzCQkJKi8KKwl1Y2hhcgluYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUJCQkqLworCXVjaGFyCXR5cGVbMzJdOwkvKiBzdHJpbmcgdHlwZSBkZXNjcmlwdGlvbgkJKi8KK30gZGlza19wYXJ0aXRpb25fdDsKKworLyogZGlzay9wYXJ0LmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm8gKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0IChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7Cit2b2lkICBpbml0X3BhcnQgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK3ZvaWQgZGV2X3ByaW50KGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKworCisjaWZkZWYgQ09ORklHX01BQ19QQVJUSVRJT04KKy8qIGRpc2svcGFydF9tYWMuYyAqLworaW50IGdldF9wYXJ0aXRpb25faW5mb19tYWMgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworaW50ICAgdGVzdF9wYXJ0X21hYyAoYmxvY2tfZGV2X2Rlc2NfdCAqZGV2X2Rlc2MpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRE9TX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X2Rvcy5jICovCitpbnQgZ2V0X3BhcnRpdGlvbl9pbmZvX2RvcyAoYmxvY2tfZGV2X2Rlc2NfdCAqIGRldl9kZXNjLCBpbnQgcGFydCwgZGlza19wYXJ0aXRpb25fdCAqaW5mbyk7Cit2b2lkIHByaW50X3BhcnRfZG9zIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfZG9zIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JU09fUEFSVElUSU9OCisvKiBkaXNrL3BhcnRfaXNvLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9faXNvIChibG9ja19kZXZfZGVzY190ICogZGV2X2Rlc2MsIGludCBwYXJ0LCBkaXNrX3BhcnRpdGlvbl90ICppbmZvKTsKK3ZvaWQgcHJpbnRfcGFydF9pc28gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKK2ludCAgIHRlc3RfcGFydF9pc28gKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FNSUdBX1BBUlRJVElPTgorLyogZGlzay9wYXJ0X2FtaWdhLmMgKi8KK2ludCBnZXRfcGFydGl0aW9uX2luZm9fYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKiBkZXZfZGVzYywgaW50IHBhcnQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwordm9pZCBwcmludF9wYXJ0X2FtaWdhIChibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyk7CitpbnQgICB0ZXN0X3BhcnRfYW1pZ2EgKGJsb2NrX2Rldl9kZXNjX3QgKmRldl9kZXNjKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX1BBUlRfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvaW5jbHVkZS9ydGMuaCBiL3gtbG9hZGVyL2luY2x1ZGUvcnRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvcnRjLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogR2VuZXJpYyBSVEMgaW50ZXJmYWNlLgorICovCisjaWZuZGVmIF9SVENfSF8KKyNkZWZpbmUgX1JUQ19IXworCisvKiBiY2Q8LT5iaW4gZnVuY3Rpb25zIGFyZSBuZWVkZWQgYnkgYWxtb3N0IGFsbCB0aGUgUlRDIGRyaXZlcnMsIGxldCdzIGluY2x1ZGUKKyAqIGl0IHRoZXJlIGluc3RlYWQgb2YgaW4gZXZleSBzaW5nbGUgZHJpdmVyICovCisKKyNpbmNsdWRlIDxiY2QuaD4KKworLyoKKyAqIFRoZSBzdHJ1Y3QgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSB0aGUgZ2VuZXJpYyBpbnRlcmZhY2UgY29kZSB0bworICogdGhlIGhhcmR3YXJlIGRlcGVuZGVuZCBsb3ctbGV2ZWwgY29kZSBhbmRlIHZpY2UgdmVyc2EuIElkZW50aWNhbAorICogdG8gc3RydWN0IHJ0Y190aW1lIHVzZWQgYnkgdGhlIExpbnV4IGtlcm5lbC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHNtYWxsIGJ1dCBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyB0byB0aGUKKyAqIGNvbW1vbiAic3RydWN0IHRpbWUiOgorICoKKyAqCQlzdHJ1Y3QgdGltZToJCXN0cnVjdCBydGNfdGltZToKKyAqIHRtX21vbgkwIC4uLiAxMQkJMSAuLi4gMTIKKyAqIHRtX3llYXIJeWVhcnMgc2luY2UgMTkwMAl5ZWFycyBzaW5jZSAwCisgKi8KKworc3RydWN0IHJ0Y190aW1lIHsKKwlpbnQgdG1fc2VjOworCWludCB0bV9taW47CisJaW50IHRtX2hvdXI7CisJaW50IHRtX21kYXk7CisJaW50IHRtX21vbjsKKwlpbnQgdG1feWVhcjsKKwlpbnQgdG1fd2RheTsKKwlpbnQgdG1feWRheTsKKwlpbnQgdG1faXNkc3Q7Cit9OworCit2b2lkIEdyZWdvcmlhbkRheSAoc3RydWN0IHJ0Y190aW1lICopOwordm9pZCB0b190bSAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7Cit1bnNpZ25lZCBsb25nIG1rdGltZSAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKKwkJICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgkvKiBfUlRDX0hfICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3RpbWVzdGFtcC5oIGIveC1sb2FkZXIvaW5jbHVkZS90aW1lc3RhbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmY0Y2Y0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvaW5jbHVkZS90aW1lc3RhbXAuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMDggRXh0cmVtZSBFbmdpbmVlcmluZyBTb2x1dGlvbnMsIEluYy4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fVElNRVNUQU1QX0hfXworI2RlZmluZQlfX1RJTUVTVEFNUF9IX18KKworI2lmbmRlZiBET19ERVBTX09OTFkKKyNpbmNsdWRlICJ0aW1lc3RhbXBfYXV0b2dlbmVyYXRlZC5oIgorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1RJTUVTVEFNUF9IX18gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUvdmVyc2lvbi5oIGIveC1sb2FkZXIvaW5jbHVkZS92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0MjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaWZuZGVmCV9fVkVSU0lPTl9IX18KKyNkZWZpbmUJX19WRVJTSU9OX0hfXworCisjaWZuZGVmIERPX0RFUFNfT05MWQorI2luY2x1ZGUgInZlcnNpb25fYXV0b2dlbmVyYXRlZC5oIgorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3dhdGNoZG9nLmggYi94LWxvYWRlci9pbmNsdWRlL3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NDE2ZAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUvd2F0Y2hkb2cuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAxCisgKiBFcmlrIFRoZWlzZW4sICBXYXZlIDcgT3B0aWNzLCBldGhlaXNlbkBtaW5kc3ByaW5nLmNvbS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogV2F0Y2hkb2cgZnVuY3Rpb25zIGFuZCBtYWNyb3MuCisgKi8KKyNpZm5kZWYgX1dBVENIRE9HX0hfCisjZGVmaW5lIF9XQVRDSERPR19IXworCisjaWYgZGVmaW5lZChDT05GSUdfSFdfV0FUQ0hET0cpICYmIGRlZmluZWQoQ09ORklHX1dBVENIRE9HKQorIyAgZXJyb3IgIkNvbmZpZ3VyYXRpb24gZXJyb3I6IENPTkZJR19IV19XQVRDSERPRyBhbmQgQ09ORklHX1dBVENIRE9HIGNhbid0IGJlIHVzZWQgdG9nZXRoZXIuIgorI2VuZGlmCisKKy8qCisgKiBIYXJkd2FyZSB3YXRjaGRvZworICovCisjaWZkZWYgQ09ORklHX0hXX1dBVENIRE9HCisJI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKQorCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIGJsIGh3X3dhdGNoZG9nX3Jlc2V0CisJI2Vsc2UKKwkJZXh0ZXJuIHZvaWQgaHdfd2F0Y2hkb2dfcmVzZXQodm9pZCk7CisKKwkJI2RlZmluZSBXQVRDSERPR19SRVNFVCBod193YXRjaGRvZ19yZXNldAorCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbHNlCisJLyoKKwkgKiBNYXliZSBhIHNvZnR3YXJlIHdhdGNoZG9nPworCSAqLworCSNpZiBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwkJI2lmIGRlZmluZWQoX19BU1NFTUJMWV9fKQorCQkJI2RlZmluZSBXQVRDSERPR19SRVNFVCBibCB3YXRjaGRvZ19yZXNldAorCQkjZWxzZQorCQkJZXh0ZXJuIHZvaWQgd2F0Y2hkb2dfcmVzZXQodm9pZCk7CisKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQgd2F0Y2hkb2dfcmVzZXQKKwkJI2VuZGlmCisJI2Vsc2UKKwkJLyoKKwkJICogTm8gaGFyZHdhcmUgb3Igc29mdHdhcmUgd2F0Y2hkb2cuCisJCSAqLworCQkjaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCisJCQkjZGVmaW5lIFdBVENIRE9HX1JFU0VUIC8qWFhYIERPX05PVF9ERUxfVEhJU19DT01NRU5UKi8KKwkJI2Vsc2UKKwkJCSNkZWZpbmUgV0FUQ0hET0dfUkVTRVQoKSB7fQorCQkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisJI2VuZGlmIC8qIENPTkZJR19XQVRDSERPRyAmJiAhX19BU1NFTUJMWV9fICovCisjZW5kaWYgLyogQ09ORklHX0hXX1dBVENIRE9HICovCisKKyNlbmRpZiAvKiBfV0FUQ0hET0dfSF8gKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL2NyYy5oIGIveC1sb2FkZXIvaW5jbHVkZS94LWxvYWQvY3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MWNhYgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL2NyYy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDkKKyAqIE1hcnZlbGwgU2VtaWNvbmR1Y3RvciA8d3d3Lm1hcnZlbGwuY29tPgorICogV3JpdHRlbi1ieTogUHJhZnVsbGEgV2FkYXNrYXIgPHByYWZ1bGxhQG1hcnZlbGwuY29tPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAorICogTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9YTE9BRF9DUkNfSAorI2RlZmluZSBfWExPQURfQ1JDX0gKKworLyogbGliL2NyYzMyLmMgKi8KK3VpbnQzMl90IGNyYzMyICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKK3VpbnQzMl90IGNyYzMyX3dkICh1aW50MzJfdCwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1aW50LCB1aW50KTsKK3VpbnQzMl90IGNyYzMyX25vX2NvbXAgKHVpbnQzMl90LCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVpbnQpOworCisjZW5kaWYgLyogX1hMT0FEX0NSQ19IICovCmRpZmYgLS1naXQgYS94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC96bGliLmggYi94LWxvYWRlci9pbmNsdWRlL3gtbG9hZC96bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNzA4MQotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2luY2x1ZGUveC1sb2FkL3psaWIuaApAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gemxpYi5oIGFuZCB6Y29uZi5oIGZyb20gdGhlIHpsaWItMS4yLjMKKyAqIGRpc3RyaWJ1dGlvbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLCB3aXRoIHNvbWUgYWRkaXRpb25zCisgKiBieSBQYXVsIE1hY2tlcnJhcyB0byBhaWQgaW4gaW1wbGVtZW50aW5nIERlZmxhdGUgY29tcHJlc3Npb24gYW5kCisgKiBkZWNvbXByZXNzaW9uIGZvciBQUFAgcGFja2V0cy4KKyAqLworCisgLyoKKyAgKiA9PUZJTEVWRVJTSU9OIDk2MDEyMj09CisgICoKKyAgKiBUaGlzIG1hcmtlciBpcyB1c2VkIGJ5IHRoZSBMaW51eCBpbnN0YWxsYXRpb24gc2NyaXB0IHRvIGRldGVybWluZQorICAqIHdoZXRoZXIgYW4gdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluc3RhbGxlZC4KKyAgKi8KKworLyogemxpYi5oIC0tIGludGVyZmFjZSBvZiB0aGUgJ3psaWInIGdlbmVyYWwgcHVycG9zZSBjb21wcmVzc2lvbiBsaWJyYXJ5CisgIHZlcnNpb24gMS4yLjMsIEp1bHkgMTh0aCwgMjAwNQorCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKKworICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCisgIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisgICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisgIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKyAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgorICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1CisKKworICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgorICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxOTUwLnR4dAorICAoemxpYiBmb3JtYXQpLCByZmMxOTUxLnR4dCAoZGVmbGF0ZSBmb3JtYXQpIGFuZCByZmMxOTUyLnR4dCAoZ3ppcCBmb3JtYXQpLgorKi8KKworI2lmbmRlZiBaTElCX0gKKyNkZWZpbmUgWkxJQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMi4zIgorI2RlZmluZSBaTElCX1ZFUk5VTSAweDEyMzAKKworLyogI2luY2x1ZGUgInpjb25mLmgiICovICAgICAgICAvKiBpbmNsdWRlZCBkaXJlY3RseSBoZXJlICovCisvKiB6Y29uZi5oIC0tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHpsaWIgY29tcHJlc3Npb24gbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBCZWdpbiBvZiBuZXcgemNvbmYuaCAqLworLyoKKyAqIElmIHlvdSAqcmVhbGx5KiBuZWVkIGEgdW5pcXVlIHByZWZpeCBmb3IgYWxsIHR5cGVzIGFuZCBsaWJyYXJ5IGZ1bmN0aW9ucywKKyAqIGNvbXBpbGUgd2l0aCAtRFpfUFJFRklYLiBUaGUgInN0YW5kYXJkIiB6bGliIHNob3VsZCBiZSBjb21waWxlZCB3aXRob3V0IGl0LgorICovCisjaWZkZWYgWl9QUkVGSVgKKyMgIGRlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgel9kZWZsYXRlSW5pdF8KKyMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCisjICBkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgIHpfZGVmbGF0ZUVuZAorIyAgZGVmaW5lIGluZmxhdGVJbml0XyAgICAgICAgICB6X2luZmxhdGVJbml0XworIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKKyMgIGRlZmluZSBpbmZsYXRlRW5kICAgICAgICAgICAgel9pbmZsYXRlRW5kCisjICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXworIyAgZGVmaW5lIGRlZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2RlZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKKyMgIGRlZmluZSBkZWZsYXRlUmVzZXQgICAgICAgICAgel9kZWZsYXRlUmVzZXQKKyMgIGRlZmluZSBkZWZsYXRlUGFyYW1zICAgICAgICAgel9kZWZsYXRlUGFyYW1zCisjICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCisjICBkZWZpbmUgZGVmbGF0ZVByaW1lICAgICAgICAgIHpfZGVmbGF0ZVByaW1lCisjICBkZWZpbmUgaW5mbGF0ZUluaXQyXyAgICAgICAgIHpfaW5mbGF0ZUluaXQyXworIyAgZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5ICB6X2luZmxhdGVTZXREaWN0aW9uYXJ5CisjICBkZWZpbmUgaW5mbGF0ZVN5bmMgICAgICAgICAgIHpfaW5mbGF0ZVN5bmMKKyMgIGRlZmluZSBpbmZsYXRlU3luY1BvaW50ICAgICAgel9pbmZsYXRlU3luY1BvaW50CisjICBkZWZpbmUgaW5mbGF0ZUNvcHkgICAgICAgICAgIHpfaW5mbGF0ZUNvcHkKKyMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKKyMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjaworIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCisjICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKKyMgIGRlZmluZSBjb21wcmVzczIgICAgICAgICAgICAgel9jb21wcmVzczIKKyMgIGRlZmluZSBjb21wcmVzc0JvdW5kICAgICAgICAgel9jb21wcmVzc0JvdW5kCisjICBkZWZpbmUgdW5jb21wcmVzcyAgICAgICAgICAgIHpfdW5jb21wcmVzcworIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKKyMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgorIyAgZGVmaW5lIGdldF9jcmNfdGFibGUgICAgICAgICB6X2dldF9jcmNfdGFibGUKKyMgIGRlZmluZSB6RXJyb3IgICAgICAgICAgICAgICAgel96RXJyb3IKKworIyAgZGVmaW5lIGFsbG9jX2Z1bmMgICAgICAgICAgICB6X2FsbG9jX2Z1bmMKKyMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKKyMgIGRlZmluZSBpbl9mdW5jICAgICAgICAgICAgICAgel9pbl9mdW5jCisjICBkZWZpbmUgb3V0X2Z1bmMgICAgICAgICAgICAgIHpfb3V0X2Z1bmMKKyMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCisjICBkZWZpbmUgdUludCAgICAgICAgICAgICAgICAgIHpfdUludAorIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCisjICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKKyMgIGRlZmluZSBjaGFyZiAgICAgICAgICAgICAgICAgel9jaGFyZgorIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKKyMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgorIyAgZGVmaW5lIHVMb25nZiAgICAgICAgICAgICAgICB6X3VMb25nZgorIyAgZGVmaW5lIHZvaWRwZiAgICAgICAgICAgICAgICB6X3ZvaWRwZgorIyAgZGVmaW5lIHZvaWRwICAgICAgICAgICAgICAgICB6X3ZvaWRwCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NU0RPU19fKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisjaWYgKGRlZmluZWQoT1NfMikgfHwgZGVmaW5lZChfX09TMl9fKSkgJiYgIWRlZmluZWQoT1MyKQorIyAgZGVmaW5lIE9TMgorI2VuZGlmCisjaWYgZGVmaW5lZChfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKKyMgIGlmbmRlZiBXSU4zMgorIyAgICBkZWZpbmUgV0lOMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoV0lORE9XUykpICYmICFkZWZpbmVkKFdJTjMyKQorIyAgaWYgIWRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fRkxBVF9fKSAmJiAhZGVmaW5lZChfXzM4Nl9fKQorIyAgICBpZm5kZWYgU1lTMTZCSVQKKyMgICAgICBkZWZpbmUgU1lTMTZCSVQKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIENvbXBpbGUgd2l0aCAtRE1BWFNFR182NEsgaWYgdGhlIGFsbG9jIGZ1bmN0aW9uIGNhbm5vdCBhbGxvY2F0ZSBtb3JlCisgKiB0aGFuIDY0ayBieXRlcyBhdCBhIHRpbWUgKG5lZWRlZCBvbiBzeXN0ZW1zIHdpdGggMTYtYml0IGludCkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgZGVmaW5lIE1BWFNFR182NEsKKyNlbmRpZgorI2lmZGVmIE1TRE9TCisjICBkZWZpbmUgVU5BTElHTkVEX09LCisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19WRVJTSU9OX18KKyMgIGlmbmRlZiBTVERDCisjICAgIGRlZmluZSBTVERDCisjICBlbmRpZgorIyAgaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjICAgIGlmbmRlZiBTVERDOTkKKyMgICAgICBkZWZpbmUgU1REQzk5CisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoX19jcGx1c3BsdXMpKQorIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorI2lmICFkZWZpbmVkKFNUREMpICYmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChXSU4zMikpCisjICBkZWZpbmUgU1REQworI2VuZGlmCisjaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoT1MyKSB8fCBkZWZpbmVkKF9fSE9TX0FJWF9fKSkKKyMgIGRlZmluZSBTVERDCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKSAmJiAhZGVmaW5lZChTVERDKSAgICAvKiBpU2VyaWVzIChmb3JtZXJseSBBUy80MDApLiAqLworIyAgZGVmaW5lIFNUREMKKyNlbmRpZgorCisjaWZuZGVmIFNUREMKKyMgIGlmbmRlZiBjb25zdCAvKiBjYW5ub3QgdXNlICFkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKGNvbnN0KSBvbiBNYWMgKi8KKyMgICAgZGVmaW5lIGNvbnN0ICAgICAgIC8qIG5vdGU6IG5lZWQgYSBtb3JlIGdlbnRsZSBzb2x1dGlvbiBoZXJlICovCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFNvbWUgTWFjIGNvbXBpbGVycyBtZXJnZSBhbGwgLmggZmlsZXMgaW5jb3JyZWN0bHk6ICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKXx8ZGVmaW5lZChhcHBsZWMpfHxkZWZpbmVkKFRISU5LX0MpfHxkZWZpbmVkKF9fU0NfXykKKyMgIGRlZmluZSBOT19EVU1NWV9ERUNMCisjZW5kaWYKKworLyogTWF4aW11bSB2YWx1ZSBmb3IgbWVtTGV2ZWwgaW4gZGVmbGF0ZUluaXQyICovCisjaWZuZGVmIE1BWF9NRU1fTEVWRUwKKyMgIGlmZGVmIE1BWFNFR182NEsKKyMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOAorIyAgZWxzZQorIyAgICBkZWZpbmUgTUFYX01FTV9MRVZFTCA5CisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1heGltdW0gdmFsdWUgZm9yIHdpbmRvd0JpdHMgaW4gZGVmbGF0ZUluaXQyIGFuZCBpbmZsYXRlSW5pdDIuCisgKiBXQVJOSU5HOiByZWR1Y2luZyBNQVhfV0JJVFMgbWFrZXMgbWluaWd6aXAgdW5hYmxlIHRvIGV4dHJhY3QgLmd6IGZpbGVzCisgKiBjcmVhdGVkIGJ5IGd6aXAuIChGaWxlcyBjcmVhdGVkIGJ5IG1pbmlnemlwIGNhbiBzdGlsbCBiZSBleHRyYWN0ZWQgYnkKKyAqIGd6aXAuKQorICovCisjaWZuZGVmIE1BWF9XQklUUworIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLworI2VuZGlmCisKKy8qIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBkZWZsYXRlIGFyZSAoaW4gYnl0ZXMpOgorICAgICAgICAgICAgKDEgPDwgKHdpbmRvd0JpdHMrMikpICsgICgxIDw8IChtZW1MZXZlbCs5KSkKKyB0aGF0IGlzOiAxMjhLIGZvciB3aW5kb3dCaXRzPTE1ICArICAxMjhLIGZvciBtZW1MZXZlbCA9IDggIChkZWZhdWx0IHZhbHVlcykKKyBwbHVzIGEgZmV3IGtpbG9ieXRlcyBmb3Igc21hbGwgb2JqZWN0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIHJlZHVjZQorIHRoZSBkZWZhdWx0IG1lbW9yeSByZXF1aXJlbWVudHMgZnJvbSAyNTZLIHRvIDEyOEssIGNvbXBpbGUgd2l0aAorICAgICBtYWtlIENGTEFHUz0iLU8gLURNQVhfV0JJVFM9MTQgLURNQVhfTUVNX0xFVkVMPTciCisgT2YgY291cnNlIHRoaXMgd2lsbCBnZW5lcmFsbHkgZGVncmFkZSBjb21wcmVzc2lvbiAodGhlcmUncyBubyBmcmVlIGx1bmNoKS4KKworICAgVGhlIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIGluZmxhdGUgYXJlIChpbiBieXRlcykgMSA8PCB3aW5kb3dCaXRzCisgdGhhdCBpcywgMzJLIGZvciB3aW5kb3dCaXRzPTE1IChkZWZhdWx0IHZhbHVlKSBwbHVzIGEgZmV3IGtpbG9ieXRlcworIGZvciBzbWFsbCBvYmplY3RzLgorKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBPRiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCisjICBpZmRlZiBTVERDCisjICAgIGRlZmluZSBPRihhcmdzKSAgYXJncworIyAgZWxzZQorIyAgICBkZWZpbmUgT0YoYXJncykgICgpCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgZm9yIEZBUiBhcmUgbmVlZGVkIG9ubHkgZm9yIE1TRE9TIG1peGVkCisgKiBtb2RlbCBwcm9ncmFtbWluZyAoc21hbGwgb3IgbWVkaXVtIG1vZGVsIHdpdGggc29tZSBmYXIgYWxsb2NhdGlvbnMpLgorICogVGhpcyB3YXMgdGVzdGVkIG9ubHkgd2l0aCBNU0M7IGZvciBvdGhlciBNU0RPUyBjb21waWxlcnMgeW91IG1heSBoYXZlCisgKiB0byBkZWZpbmUgTk9fTUVNQ1BZIGluIHp1dGlsLmguICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgbWl4ZWQgbW9kZWwsCisgKiBqdXN0IGRlZmluZSBGQVIgdG8gYmUgZW1wdHkuCisgKi8KKyNpZmRlZiBTWVMxNkJJVAorIyAgaWYgZGVmaW5lZChNX0k4NlNNKSB8fCBkZWZpbmVkKE1fSTg2TU0pCisgICAgIC8qIE1TQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KKyMgICAgZGVmaW5lIFNNQUxMX01FRElVTQorIyAgICBpZmRlZiBfTVNDX1ZFUgorIyAgICAgIGRlZmluZSBGQVIgX2ZhcgorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIEZBUiBmYXIKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjICBpZiAoZGVmaW5lZChfX1NNQUxMX18pIHx8IGRlZmluZWQoX19NRURJVU1fXykpCisgICAgIC8qIFR1cmJvIEMgc21hbGwgb3IgbWVkaXVtIG1vZGVsICovCisjICAgIGRlZmluZSBTTUFMTF9NRURJVU0KKyMgICAgaWZkZWYgX19CT1JMQU5EQ19fCisjICAgICAgZGVmaW5lIEZBUiBfZmFyCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgRkFSIGZhcgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKQorICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiBhcyBhIERMTCwgZGVmaW5lIFpMSUJfRExMLgorICAgICogVGhpcyBpcyBub3QgbWFuZGF0b3J5LCBidXQgaXQgb2ZmZXJzIGEgbGl0dGxlIHBlcmZvcm1hbmNlIGluY3JlYXNlLgorICAgICovCisjICBpZmRlZiBaTElCX0RMTAorIyAgICBpZiBkZWZpbmVkKFdJTjMyKSAmJiAoIWRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX19CT1JMQU5EQ19fID49IDB4NTAwKSkKKyMgICAgICBpZmRlZiBaTElCX0lOVEVSTkFMCisjICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGVuZGlmCisjICAgIGVuZGlmCisjICBlbmRpZiAgLyogWkxJQl9ETEwgKi8KKyAgIC8qIElmIGJ1aWxkaW5nIG9yIHVzaW5nIHpsaWIgd2l0aCB0aGUgV0lOQVBJL1dJTkFQSVYgY2FsbGluZyBjb252ZW50aW9uLAorICAgICogZGVmaW5lIFpMSUJfV0lOQVBJLgorICAgICogQ2F1dGlvbjogdGhlIHN0YW5kYXJkIFpMSUIxLkRMTCBpcyBOT1QgY29tcGlsZWQgdXNpbmcgWkxJQl9XSU5BUEkuCisgICAgKi8KKyMgIGlmZGVmIFpMSUJfV0lOQVBJCisjICAgIGlmZGVmIEZBUgorIyAgICAgIHVuZGVmIEZBUgorIyAgICBlbmRpZgorIyAgICBpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgIC8qIE5vIG5lZWQgZm9yIF9leHBvcnQsIHVzZSBaTElCLkRFRiBpbnN0ZWFkLiAqLworICAgICAvKiBGb3IgY29tcGxldGUgV2luZG93cyBjb21wYXRpYmlsaXR5LCB1c2UgV0lOQVBJLCBub3QgX19zdGRjYWxsLiAqLworIyAgICBkZWZpbmUgWkVYUE9SVCBXSU5BUEkKKyMgICAgaWZkZWYgV0lOMzIKKyMgICAgICBkZWZpbmUgWkVYUE9SVFZBIFdJTkFQSVYKKyMgICAgZWxzZQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgRkFSIENERUNMCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX0JFT1NfXykKKyMgIGlmZGVmIFpMSUJfRExMCisjICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgIGVsc2UKKyMgICAgICBkZWZpbmUgWkVYUE9SVCAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWkVYVEVSTgorIyAgZGVmaW5lIFpFWFRFUk4gZXh0ZXJuCisjZW5kaWYKKyNpZm5kZWYgWkVYUE9SVAorIyAgZGVmaW5lIFpFWFBPUlQKKyNlbmRpZgorI2lmbmRlZiBaRVhQT1JUVkEKKyMgIGRlZmluZSBaRVhQT1JUVkEKKyNlbmRpZgorCisjaWZuZGVmIEZBUgorIyAgZGVmaW5lIEZBUgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfX01BQ1RZUEVTX18pCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KKyNlbmRpZgordHlwZWRlZiB1bnNpZ25lZCBpbnQgICB1SW50OyAgLyogMTYgYml0cyBvciBtb3JlICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIHVMb25nOyAvKiAzMiBiaXRzIG9yIG1vcmUgKi8KKworI2lmZGVmIFNNQUxMX01FRElVTQorICAgLyogQm9ybGFuZCBDL0MrKyBhbmQgc29tZSBvbGQgTVNDIHZlcnNpb25zIGlnbm9yZSBGQVIgaW5zaWRlIHR5cGVkZWYgKi8KKyMgIGRlZmluZSBCeXRlZiBCeXRlIEZBUgorI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSAgRkFSIEJ5dGVmOworI2VuZGlmCit0eXBlZGVmIGNoYXIgIEZBUiBjaGFyZjsKK3R5cGVkZWYgaW50ICAgRkFSIGludGY7Cit0eXBlZGVmIHVJbnQgIEZBUiB1SW50ZjsKK3R5cGVkZWYgdUxvbmcgRkFSIHVMb25nZjsKKworI2lmZGVmIFNUREMKKyAgIHR5cGVkZWYgdm9pZCBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiB2b2lkIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIHZvaWQgICAgICAgKnZvaWRwOworI2Vsc2UKKyAgIHR5cGVkZWYgQnl0ZSBjb25zdCAqdm9pZHBjOworICAgdHlwZWRlZiBCeXRlIEZBUiAgICp2b2lkcGY7CisgICB0eXBlZGVmIEJ5dGUgICAgICAgKnZvaWRwOworI2VuZGlmCisKKyMgIGlmZGVmIFZNUworIyAgICBpbmNsdWRlIDx1bml4aW8uaD4gICAvKiBmb3Igb2ZmX3QgKi8KKyMgIGVuZGlmCisjICBkZWZpbmUgel9vZmZfdCBvZmZfdAorI2lmbmRlZiBTRUVLX1NFVAorIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCisjICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLworIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KKyNlbmRpZgorI2lmbmRlZiB6X29mZl90CisjICBkZWZpbmUgel9vZmZfdCBsb25nCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PUzQwMF9fKQorIyAgZGVmaW5lIE5PX3ZzbnByaW50ZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTVZTX18pCisjICBkZWZpbmUgTk9fdnNucHJpbnRmCisjICBpZmRlZiBGQVIKKyMgICAgdW5kZWYgRkFSCisjICBlbmRpZgorI2VuZGlmCisKKy8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCisjaWYgZGVmaW5lZChfX01WU19fKQorIyAgIHByYWdtYSBtYXAoZGVmbGF0ZUluaXRfLCJERUlOIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVJbml0Ml8sIkRFSU4yIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKKyMgICBwcmFnbWEgbWFwKGRlZmxhdGVCb3VuZCwiREVCTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZUluaXRfLCJJTklOIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVFbmQsIklORU5EIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTeW5jLCJJTlNZIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQorIyAgIHByYWdtYSBtYXAoY29tcHJlc3NCb3VuZCwiQ01CTkQiKQorIyAgIHByYWdtYSBtYXAoaW5mbGF0ZV90YWJsZSwiSU5UQUJMIikKKyMgICBwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCisjICAgcHJhZ21hIG1hcChpbmZsYXRlX2NvcHlyaWdodCwiSU5DT1BZIikKKyNlbmRpZgorLyogRW5kIG9mIG5ldyB6Y29uZi5oICovCisKKy8qCisgICAgIFRoZSAnemxpYicgY29tcHJlc3Npb24gbGlicmFyeSBwcm92aWRlcyBpbi1tZW1vcnkgY29tcHJlc3Npb24gYW5kCisgIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgaW50ZWdyaXR5IGNoZWNrcyBvZiB0aGUgdW5jb21wcmVzc2VkCisgIGRhdGEuICBUaGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgc3VwcG9ydHMgb25seSBvbmUgY29tcHJlc3Npb24gbWV0aG9kCisgIChkZWZsYXRpb24pIGJ1dCBvdGhlciBhbGdvcml0aG1zIHdpbGwgYmUgYWRkZWQgbGF0ZXIgYW5kIHdpbGwgaGF2ZSB0aGUgc2FtZQorICBzdHJlYW0gaW50ZXJmYWNlLgorCisgICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlCisgIGVub3VnaCAoZm9yIGV4YW1wbGUgaWYgYW4gaW5wdXQgZmlsZSBpcyBtbWFwJ2VkKSwgb3IgY2FuIGJlIGRvbmUgYnkKKyAgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUKKyAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAorICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgorCisgICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKKyAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCisgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAorICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8gdXNpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHN0YXJ0CisgIHdpdGggImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEKKyAgZ3ppcCB3cmFwcGVyLCBkb2N1bWVudGVkIGluIFJGQyAxOTUyLCB3cmFwcGVkIGFyb3VuZCBhIGRlZmxhdGUgc3RyZWFtLgorCisgICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCisKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCisgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKKyAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgorICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgorKi8KKwordHlwZWRlZiB2b2lkcGYgKCphbGxvY19mdW5jKSBPRigodm9pZHBmIG9wYXF1ZSwgdUludCBpdGVtcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmZyZWVfZnVuYykgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgYWRkcmVzcywgdUludCBzaXplKSk7Cit0eXBlZGVmIHZvaWQgICAoKmNiX2Z1bmMpICAgIE9GKChCeXRlZiAqYnVmLCB1SW50IGxlbikpOworCitzdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHpfc3RyZWFtX3MgeworCUJ5dGVmCSpuZXh0X2luOyAvKiBuZXh0IGlucHV0IGJ5dGUgKi8KKwl1SW50CWF2YWlsX2luOyAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IG5leHRfaW4gKi8KKwl1TG9uZwl0b3RhbF9pbjsgLyogdG90YWwgbmIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KKwlCeXRlZgkqbmV4dF9vdXQ7IC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqLworCXVJbnQJYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLworCXVMb25nCXRvdGFsX291dDsgLyogdG90YWwgbmIgb2YgYnl0ZXMgb3V0cHV0IHNvIGZhciAqLworCWNoYXIJKm1zZzsJLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCisJc3RydWN0CWludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLworCWFsbG9jX2Z1bmMJemFsbG9jOwkvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCWZyZWVfZnVuYwl6ZnJlZTsJLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLworCXZvaWRwZglvcGFxdWU7CS8qIHByaXZhdGUgZGF0YSBvYmplY3QgcGFzc2VkIHRvIHphbGxvYyBhbmQgemZyZWUgKi8KKwlpbnQJZGF0YV90eXBlOwkvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6CisJCQkJCWJpbmFyeSBvciB0ZXh0ICovCisJY2JfZnVuYwlvdXRjYjsJLyogY2FsbGVkIHJlZ3VsYXJseSBqdXN0IGJlZm9yZSBibG9ja3Mgb2Ygb3V0cHV0ICovCisJdUxvbmcJYWRsZXI7CS8qIGFkbGVyMzIgdmFsdWUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhICovCisJdUxvbmcJcmVzZXJ2ZWQ7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCit9IHpfc3RyZWFtOworCit0eXBlZGVmIHpfc3RyZWFtIEZBUiAqel9zdHJlYW1wOworCisvKgorICAgICBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBwYXNzZWQgdG8gYW5kIGZyb20gemxpYiByb3V0aW5lcy4gIFNlZSBSRkMgMTk1MgorICBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBtZWFuaW5ncyBvZiB0aGVzZSBmaWVsZHMuCisqLwordHlwZWRlZiBzdHJ1Y3QgZ3pfaGVhZGVyX3MgeworCWludAl0ZXh0OwkvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCisJdUxvbmcJdGltZTsJLyogbW9kaWZpY2F0aW9uIHRpbWUgKi8KKwlpbnQJeGZsYWdzOwkvKiBleHRyYSBmbGFncyAobm90IHVzZWQgd2hlbiB3cml0aW5nIGEgZ3ppcCBmaWxlKSAqLworCWludAlvczsJLyogb3BlcmF0aW5nIHN5c3RlbSAqLworCUJ5dGVmCSpleHRyYTsJLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqLworCXVJbnQJZXh0cmFfbGVuOyAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi8KKwl1SW50CWV4dHJhX21heDsgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlCeXRlZgkqbmFtZTsgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqLworCXVJbnQJbmFtZV9tYXg7IC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KKwlCeXRlZgkqY29tbWVudDsgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgY29tbWVudCBvciBaX05VTEwgKi8KKwl1SW50CWNvbW1fbWF4OyAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCisJaW50CWhjcmM7IC8qIHRydWUgaWYgdGhlcmUgd2FzIG9yIHdpbGwgYmUgYSBoZWFkZXIgY3JjICovCisJaW50CWRvbmU7IC8qIHRydWUgd2hlbiBkb25lIHJlYWRpbmcgZ3ppcCBoZWFkZXIgKG5vdCB1c2VkCisJCQl3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovCit9IGd6X2hlYWRlcjsKKwordHlwZWRlZiBnel9oZWFkZXIgRkFSICpnel9oZWFkZXJwOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb25zdGFudHMgKi8KKyNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKKyNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEgLyogd2lsbCBiZSByZW1vdmVkLCB1c2UgWl9TWU5DX0ZMVVNIIGluc3RlYWQgKi8KKyNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKKyNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKKyNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKKyNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX09LICAgICAgICAgICAgMAorI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQorI2RlZmluZSBaX05FRURfRElDVCAgICAgMgorI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCisjZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKKyNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQorI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCisjZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKKyNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKKy8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZQorICogdmFsdWVzIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KKyAqLworCisjZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCisjZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCisjZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5CisjZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQorLyogY29tcHJlc3Npb24gbGV2ZWxzICovCisKKyNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKKyNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKKy8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KKworI2RlZmluZSBaX0JJTkFSWSAgIDAKKyNkZWZpbmUgWl9URVhUICAgICAxCisjZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLworI2RlZmluZSBaX1VOS05PV04gIDIKKy8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KKworI2RlZmluZSBaX0RFRkxBVEVEICAgOAorLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KKworI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLworCisvKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCisgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcworICAgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgVGhpcyBjaGVjayBpcyBhdXRvbWF0aWNhbGx5IG1hZGUgYnkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0LgorICovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgY29uc3QgY2hhciAqdmVyc2lvbiwKKwkJCQlpbnQgc3RyZWFtX3NpemUpKTsKKworWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7CisvKgorICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0CisgIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gSXQgbWF5IGludHJvZHVjZQorICBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpIGV4Y2VwdCB3aGVuCisgIGZvcmNlZCB0byBmbHVzaC4KKworICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiBpbmZsYXRlIHBlcmZvcm1zIG9uZSBvciBib3RoIG9mIHRoZQorICBmb2xsb3dpbmcgYWN0aW9uczoKKworICAtIERlY29tcHJlc3MgbW9yZSBpbnB1dCBzdGFydGluZyBhdCBuZXh0X2luIGFuZCB1cGRhdGUgbmV4dF9pbiBhbmQgYXZhaWxfaW4KKyAgICBhY2NvcmRpbmdseS4gSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAorICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nCisgICAgd2lsbCByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAorICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZQorICAgIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cKKyAgICBhYm91dCB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KKworICBCZWZvcmUgdGhlIGNhbGwgb2YgaW5mbGF0ZSgpLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGVuc3VyZSB0aGF0IGF0IGxlYXN0CisgIG9uZSBvZiB0aGUgYWN0aW9ucyBpcyBwb3NzaWJsZSwgYnkgcHJvdmlkaW5nIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWluZworICBtb3JlIG91dHB1dCwgYW5kIHVwZGF0aW5nIHRoZSBuZXh0XyogYW5kIGF2YWlsXyogdmFsdWVzIGFjY29yZGluZ2x5LgorICBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yCisgIGV4YW1wbGUgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2gKKyAgY2FsbCBvZiBpbmZsYXRlKCkuIElmIGluZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoIHplcm8gYXZhaWxfb3V0LCBpdAorICBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNhdXNlIHRoZXJlCisgIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCisKKyAgICBUaGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBjYW4gYmUgWl9OT19GTFVTSCwgWl9TWU5DX0ZMVVNILAorICBaX0ZJTklTSCwgb3IgWl9CTE9DSy4gWl9TWU5DX0ZMVVNIIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIGZsdXNoIGFzIG11Y2gKKyAgb3V0cHV0IGFzIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpIHN0b3AKKyAgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiBXaGVuIGRlY29kaW5nIHRoZQorICB6bGliIG9yIGd6aXAgZm9ybWF0LCB0aGlzIHdpbGwgY2F1c2UgaW5mbGF0ZSgpIHRvIHJldHVybiBpbW1lZGlhdGVseSBhZnRlcgorICB0aGUgaGVhZGVyIGFuZCBiZWZvcmUgdGhlIGZpcnN0IGJsb2NrLiBXaGVuIGRvaW5nIGEgcmF3IGluZmxhdGUsIGluZmxhdGUoKQorICB3aWxsIGdvIGFoZWFkIGFuZCBwcm9jZXNzIHRoZSBmaXJzdCBibG9jaywgYW5kIHdpbGwgcmV0dXJuIHdoZW4gaXQgZ2V0cyB0bworICB0aGUgZW5kIG9mIHRoYXQgYmxvY2ssIG9yIHdoZW4gaXQgcnVucyBvdXQgb2YgZGF0YS4KKworICAgIFRoZSBaX0JMT0NLIG9wdGlvbiBhc3Npc3RzIGluIGFwcGVuZGluZyB0byBvciBjb21iaW5pbmcgZGVmbGF0ZSBzdHJlYW1zLgorICBBbHNvIHRvIGFzc2lzdCBpbiB0aGlzLCBvbiByZXR1cm4gaW5mbGF0ZSgpIHdpbGwgc2V0IHN0cm0tPmRhdGFfdHlwZSB0byB0aGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IGJ5dGUgdGFrZW4gZnJvbSBzdHJtLT5uZXh0X2luLCBwbHVzIDY0CisgIGlmIGluZmxhdGUoKSBpcyBjdXJyZW50bHkgZGVjb2RpbmcgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGRlZmxhdGUgc3RyZWFtLAorICBwbHVzIDEyOCBpZiBpbmZsYXRlKCkgcmV0dXJuZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZGVjb2RpbmcgYW4gZW5kLW9mLWJsb2NrCisgIGNvZGUgb3IgZGVjb2RpbmcgdGhlIGNvbXBsZXRlIGhlYWRlciB1cCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKyAgZGVmbGF0ZSBzdHJlYW0uIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUKKyAgbnVtYmVyIG9mIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4KKyAgYml0IDcgb2YgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUKKyAgbGVzcyB0aGFuIGVpZ2h0LgorCisgICAgaW5mbGF0ZSgpIHNob3VsZCBub3JtYWxseSBiZSBjYWxsZWQgdW50aWwgaXQgcmV0dXJucyBaX1NUUkVBTV9FTkQgb3IgYW4KKyAgZXJyb3IuIEhvd2V2ZXIgaWYgYWxsIGRlY29tcHJlc3Npb24gaXMgdG8gYmUgcGVyZm9ybWVkIGluIGEgc2luZ2xlIHN0ZXAKKyAgKGEgc2luZ2xlIGNhbGwgb2YgaW5mbGF0ZSksIHRoZSBwYXJhbWV0ZXIgZmx1c2ggc2hvdWxkIGJlIHNldCB0bworICBaX0ZJTklTSC4gSW4gdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcKKyAgb3V0cHV0IGlzIGZsdXNoZWQ7IGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCB0aGUKKyAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAorICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKKyAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAorICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KKworICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbmZsYXRlKCkgYWx3YXlzIGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQgYXMKKyAgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuZCBhbHdheXMgdXNlcyB0aGUgZmFzdGVyIGFwcHJvYWNoIG9uIHRoZQorICBmaXJzdCBjYWxsLiBTbyB0aGUgb25seSBlZmZlY3Qgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBpbiB0aGlzIGltcGxlbWVudGF0aW9uCisgIGlzIG9uIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5mbGF0ZSgpLCBhcyBub3RlZCBiZWxvdywgb3Igd2hlbiBpdCByZXR1cm5zIGVhcmx5CisgIGJlY2F1c2UgWl9CTE9DSyBpcyB1c2VkLgorCisgICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5CisgIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBhZGxlcjMyIGNoZWNrc3VtIG9mIHRoZSBkaWN0aW9uYXJ5CisgIGNob3NlbiBieSB0aGUgY29tcHJlc3NvciBhbmQgcmV0dXJucyBaX05FRURfRElDVDsgb3RoZXJ3aXNlIGl0IHNldHMKKyAgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIG91dHB1dCBwcm9kdWNlZCBzbyBmYXIgKHRoYXQgaXMsCisgIHRvdGFsX291dCBieXRlcykgYW5kIHJldHVybnMgWl9PSywgWl9TVFJFQU1fRU5EIG9yIGFuIGVycm9yIGNvZGUgYXMgZGVzY3JpYmVkCisgIGJlbG93LiBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgorICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAorICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgorCisgICAgaW5mbGF0ZSgpIHdpbGwgZGVjb21wcmVzcyBhbmQgY2hlY2sgZWl0aGVyIHpsaWItd3JhcHBlZCBvciBnemlwLXdyYXBwZWQKKyAgZGVmbGF0ZSBkYXRhLiAgVGhlIGhlYWRlciB0eXBlIGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkuICBBbnkgaW5mb3JtYXRpb24KKyAgY29udGFpbmVkIGluIHRoZSBnemlwIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdAorICBpbmZvcm1hdGlvbiBzaG91bGQgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IKKyAgaW5mbGF0ZUJhY2soKSBhbmQgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kCisgIHRyYWlsZXIuCisKKyAgICBpbmZsYXRlKCkgcmV0dXJucyBaX09LIGlmIHNvbWUgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSAobW9yZSBpbnB1dCBwcm9jZXNzZWQKKyAgb3IgbW9yZSBvdXRwdXQgcHJvZHVjZWQpLCBaX1NUUkVBTV9FTkQgaWYgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcworICBiZWVuIHJlYWNoZWQgYW5kIGFsbCB1bmNvbXByZXNzZWQgb3V0cHV0IGhhcyBiZWVuIHByb2R1Y2VkLCBaX05FRURfRElDVCBpZiBhCisgIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50LCBaX0RBVEFfRVJST1IgaWYgdGhlIGlucHV0IGRhdGEgd2FzCisgIGNvcnJ1cHRlZCAoaW5wdXQgc3RyZWFtIG5vdCBjb25mb3JtaW5nIHRvIHRoZSB6bGliIGZvcm1hdCBvciBpbmNvcnJlY3QgY2hlY2sKKyAgdmFsdWUpLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0cnVjdHVyZSB3YXMgaW5jb25zaXN0ZW50IChmb3IgZXhhbXBsZQorICBpZiBuZXh0X2luIG9yIG5leHRfb3V0IHdhcyBOVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAorICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQorICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gTm90ZSB0aGF0IFpfQlVGX0VSUk9SIGlzIG5vdCBmYXRhbCwgYW5kCisgIGluZmxhdGUoKSBjYW4gYmUgY2FsbGVkIGFnYWluIHdpdGggbW9yZSBpbnB1dCBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgdG8KKyAgY29udGludWUgZGVjb21wcmVzc2luZy4gSWYgWl9EQVRBX0VSUk9SIGlzIHJldHVybmVkLCB0aGUgYXBwbGljYXRpb24gbWF5IHRoZW4KKyAgY2FsbCBpbmZsYXRlU3luYygpIHRvIGxvb2sgZm9yIGEgZ29vZCBjb21wcmVzc2lvbiBibG9jayBpZiBhIHBhcnRpYWwgcmVjb3ZlcnkKKyAgb2YgdGhlIGRhdGEgaXMgZGVzaXJlZC4KKyovCisKK1pFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUVuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKy8qCisgICAgIEFsbCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGlzIHN0cmVhbSBhcmUgZnJlZWQuCisgICBUaGlzIGZ1bmN0aW9uIGRpc2NhcmRzIGFueSB1bnByb2Nlc3NlZCBpbnB1dCBhbmQgZG9lcyBub3QgZmx1c2ggYW55CisgICBwZW5kaW5nIG91dHB1dC4KKworICAgICBpbmZsYXRlRW5kIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc3RyZWFtIHN0YXRlCisgICB3YXMgaW5jb25zaXN0ZW50LiBJbiB0aGUgZXJyb3IgY2FzZSwgbXNnIG1heSBiZSBzZXQgYnV0IHRoZW4gcG9pbnRzIHRvIGEKKyAgIHN0YXRpYyBzdHJpbmcgKHdoaWNoIG11c3Qgbm90IGJlIGRlYWxsb2NhdGVkKS4KKyovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkdmFuY2VkIGZ1bmN0aW9ucyAqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVSZXNldCBPRigoel9zdHJlYW1wIHN0cm0pKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyoKKyAgICAgVGhlIGZvbGxvd2luZyB1dGlsaXR5IGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZQorICAgYmFzaWMgc3RyZWFtLW9yaWVudGVkIGZ1bmN0aW9ucy4gVG8gc2ltcGxpZnkgdGhlIGludGVyZmFjZSwgc29tZQorICAgZGVmYXVsdCBvcHRpb25zIGFyZSBhc3N1bWVkIChjb21wcmVzc2lvbiBsZXZlbCBhbmQgbWVtb3J5IHVzYWdlLAorICAgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zKS4gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlCisgICB1dGlsaXR5IGZ1bmN0aW9ucyBjYW4gZWFzaWx5IGJlIG1vZGlmaWVkIGlmIHlvdSBuZWVkIHNwZWNpYWwgb3B0aW9ucy4KKyovCisKK1pFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyIE9GKCh1TG9uZyBhZGxlciwgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQWRsZXItMzIgY2hlY2tzdW0gd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQKKyAgIHJldHVybiB0aGUgdXBkYXRlZCBjaGVja3N1bS4gSWYgYnVmIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgdGhlIHJlcXVpcmVkIGluaXRpYWwgdmFsdWUgZm9yIHRoZSBjaGVja3N1bS4KKyAgIEFuIEFkbGVyLTMyIGNoZWNrc3VtIGlzIGFsbW9zdCBhcyByZWxpYWJsZSBhcyBhIENSQzMyIGJ1dCBjYW4gYmUgY29tcHV0ZWQKKyAgIG11Y2ggZmFzdGVyLiBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGFkbGVyID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKKworICAgICB3aGlsZSAocmVhZF9idWZmZXIoYnVmZmVyLCBsZW5ndGgpICE9IEVPRikgeworICAgICAgIGFkbGVyID0gYWRsZXIzMihhZGxlciwgYnVmZmVyLCBsZW5ndGgpOworICAgICB9CisgICAgIGlmIChhZGxlciAhPSBvcmlnaW5hbF9hZGxlcikgZXJyb3IoKTsKKyovCisKKy8qCisgICAgIENvbWJpbmUgdHdvIEFkbGVyLTMyIGNoZWNrc3VtcyBpbnRvIG9uZS4gIEZvciB0d28gc2VxdWVuY2VzIG9mIGJ5dGVzLCBzZXExCisgICBhbmQgc2VxMiB3aXRoIGxlbmd0aHMgbGVuMSBhbmQgbGVuMiwgQWRsZXItMzIgY2hlY2tzdW1zIHdlcmUgY2FsY3VsYXRlZCBmb3IKKyAgIGVhY2gsIGFkbGVyMSBhbmQgYWRsZXIyLiAgYWRsZXIzMl9jb21iaW5lKCkgcmV0dXJucyB0aGUgQWRsZXItMzIgY2hlY2tzdW0gb2YKKyAgIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBhZGxlcjEsIGFkbGVyMiwgYW5kIGxlbjIuCisqLworCitaRVhURVJOICB1SW50IFpFWFBPUlQgY3JjMzIgIE9GKCh1SW50IGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pKTsKKy8qCisgICAgIFVwZGF0ZSBhIHJ1bm5pbmcgQ1JDLTMyIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kIHJldHVybiB0aGUKKyAgIHVwZGF0ZWQgQ1JDLTMyLiBJZiBidWYgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZXF1aXJlZCBpbml0aWFsCisgICB2YWx1ZSBmb3IgdGhlIGZvciB0aGUgY3JjLiBQcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZyAob25lJ3MgY29tcGxlbWVudCkgaXMKKyAgIHBlcmZvcm1lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiBzbyBpdCBzaG91bGRuJ3QgYmUgZG9uZSBieSB0aGUgYXBwbGljYXRpb24uCisgICBVc2FnZSBleGFtcGxlOgorCisgICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOworCisgICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7CisgICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7CisgICAgIH0KKyAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7CisqLworCitaRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOworI2RlZmluZSBpbmZsYXRlSW5pdChzdHJtKSBcCisJaW5mbGF0ZUluaXRfKChzdHJtKSwgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKQorI2RlZmluZSBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAorCWluZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKworI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCisJc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsgLyogaGFjayBmb3IgYnVnZ3kgY29tcGlsZXJzICovCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIFpMSUJfSCAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL01ha2VmaWxlIGIveC1sb2FkZXIvbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDM0NDIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvTWFrZWZpbGUKQEAgLTAsMCArMSw2MiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAwLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQVJDSCkuYQorCitTT0JKUwkrPSBfYXNobGRpMy5vCitTT0JKUwkrPSBfZGl2c2kzLm8KK1NPQkpTCSs9IF9sc2hyZGkzLm8KK1NPQkpTCSs9IF9tb2RzaTMubworU09CSlMJKz0gX3VkaXZzaTMubworU09CSlMJKz0gX3Vtb2RzaTMubworCitDT0JKUy15ICs9IGNyYzMyLm8KK0NPQkpTLXkgKz0gY3R5cGUubworQ09CSlMteSArPSBkaXNwbGF5X29wdGlvbnMubworQ09CSlMteQkrPSBkaXYwLm8KK0NPQkpTLXkJKz0gYm9hcmQubworQ09CSlMteSArPSBzdHJpbmcubworQ09CSlMteQkrPSBlY2MubworQ09CSlMteQkrPSBwcmludGYubworQ09CSlMteQkrPSBvbWFwX2JjaF9kZWNvZGVyLm8KK0NPQkpTLXkJKz0gb21hcF9iY2gubworCitDT0JKUwk6PSAkKENPQkpTLXkpCitTUkNTCTo9ICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKKworJChMSUIpOgkkKG9iaikuZGVwZW5kICQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fYXNobGRpMy5TIGIveC1sb2FkZXIvbGliL19hc2hsZGkzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZGRjMgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fYXNobGRpMy5TCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAzLCAyMDA0LCAyMDA1CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorbGF0ZXIgdmVyc2lvbi4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlcm1pc3Npb25zIGluIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCitjb21waWxlZCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBpbnRvIGNvbWJpbmF0aW9ucyB3aXRoIG90aGVyIHByb2dyYW1zLAorYW5kIHRvIGRpc3RyaWJ1dGUgdGhvc2UgY29tYmluYXRpb25zIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIGNvbWluZworZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKK2RvIGFwcGx5IGluIG90aGVyIHJlc3BlY3RzOyBmb3IgZXhhbXBsZSwgdGhleSBjb3ZlciBtb2RpZmljYXRpb24gb2YKK3RoZSBmaWxlLCBhbmQgZGlzdHJpYnV0aW9uIHdoZW4gbm90IGxpbmtlZCBpbnRvIGEgY29tYmluZQorZXhlY3V0YWJsZS4pCisKK1RoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLworCisKKyNpZmRlZiBfX0FSTUVCX18KKyNkZWZpbmUgYWwgcjEKKyNkZWZpbmUgYWggcjAKKyNlbHNlCisjZGVmaW5lIGFsIHIwCisjZGVmaW5lIGFoIHIxCisjZW5kaWYKKworLmdsb2JsIF9fYXNobGRpMworLmdsb2JsCV9fYWVhYmlfbGxzbAorX19hc2hsZGkzOgorX19hZWFiaV9sbHNsOgorCisJc3VicwlyMywgcjIsICMzMgorCXJzYglpcCwgcjIsICMzMgorCW1vdm1pCWFoLCBhaCwgbHNsIHIyCisJbW92cGwJYWgsIGFsLCBsc2wgcjMKKwlvcnJtaQlhaCwgYWgsIGFsLCBsc3IgaXAKKwltb3YJYWwsIGFsLCBsc2wgcjIKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX2RpdnNpMy5TIGIveC1sb2FkZXIvbGliL19kaXZzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJhZGIyCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL19kaXZzaTMuUwpAQCAtMCwwICsxLDE0MiBAQAorCisubWFjcm8gQVJNX0RJVl9CT0RZIGRpdmlkZW5kLCBkaXZpc29yLCByZXN1bHQsIGN1cmJpdAorCisjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDUKKworCWNseglcY3VyYml0LCBcZGl2aXNvcgorCWNseglccmVzdWx0LCBcZGl2aWRlbmQKKwlzdWIJXHJlc3VsdCwgXGN1cmJpdCwgXHJlc3VsdAorCW1vdglcY3VyYml0LCAjMQorCW1vdglcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCBccmVzdWx0CisJbW92CVxjdXJiaXQsIFxjdXJiaXQsIGxzbCBccmVzdWx0CisJbW92CVxyZXN1bHQsICMwCisKKyNlbHNlCisKKwlAIEluaXRpYWxseSBzaGlmdCB0aGUgZGl2aXNvciBsZWZ0IDMgYml0cyBpZiBwb3NzaWJsZSwKKwlAIHNldCBjdXJiaXQgYWNjb3JkaW5nbHkuICBUaGlzIGFsbG93cyBmb3IgY3VyYml0IHRvIGJlIGxvY2F0ZWQKKwlAIGF0IHRoZSBsZWZ0IGVuZCBvZiBlYWNoIDQgYml0IG5pYmJsZXMgaW4gdGhlIGRpdmlzaW9uIGxvb3AKKwlAIHRvIHNhdmUgb25lIGxvb3AgaW4gbW9zdCBjYXNlcy4KKwl0c3QJXGRpdmlzb3IsICMweGUwMDAwMDAwCisJbW92ZXEJXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzMKKwltb3ZlcQlcY3VyYml0LCAjOAorCW1vdm5lCVxjdXJiaXQsICMxCisKKwlAIFVubGVzcyB0aGUgZGl2aXNvciBpcyB2ZXJ5IGJpZywgc2hpZnQgaXQgdXAgaW4gbXVsdGlwbGVzIG9mCisJQCBmb3VyIGJpdHMsIHNpbmNlIHRoaXMgaXMgdGhlIGFtb3VudCBvZiB1bndpbmRpbmcgaW4gdGhlIG1haW4KKwlAIGRpdmlzaW9uIGxvb3AuICBDb250aW51ZSBzaGlmdGluZyB1bnRpbCB0aGUgZGl2aXNvciBpcworCUAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlkZW5kLgorMToJY21wCVxkaXZpc29yLCAjMHgxMDAwMDAwMAorCWNtcGxvCVxkaXZpc29yLCBcZGl2aWRlbmQKKwltb3ZsbwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzbCAjNAorCW1vdmxvCVxjdXJiaXQsIFxjdXJiaXQsIGxzbCAjNAorCWJsbwkxYgorCisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisxOgljbXAJXGRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICMxCisJbW92bG8JXGN1cmJpdCwgXGN1cmJpdCwgbHNsICMxCisJYmxvCTFiCisKKwltb3YJXHJlc3VsdCwgIzAKKworI2VuZGlmCisKKwlAIERpdmlzaW9uIGxvb3AKKzE6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMQorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMxCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzEKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMgorCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMyCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzIKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMworCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMzCisJb3JyaHMJXHJlc3VsdCwgICBccmVzdWx0LCAgIFxjdXJiaXQsICBsc3IgIzMKKwljbXAJXGRpdmlkZW5kLCAjMAkJCUAgRWFybHkgdGVybWluYXRpb24/CisJbW92bmVzCVxjdXJiaXQsICAgXGN1cmJpdCwgIGxzciAjNAlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCVxkaXZpc29yLCAgXGRpdmlzb3IsIGxzciAjNAorCWJuZQkxYgorCisuZW5kbQorCisubWFjcm8gQVJNX0RJVjJfT1JERVIgZGl2aXNvciwgb3JkZXIKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXG9yZGVyLCBcZGl2aXNvcgorCXJzYglcb3JkZXIsIFxvcmRlciwgIzMxCisKKyNlbHNlCisKKwljbXAJXGRpdmlzb3IsICMoMSA8PCAxNikKKwltb3ZocwlcZGl2aXNvciwgXGRpdmlzb3IsIGxzciAjMTYKKwltb3Zocwlcb3JkZXIsICMxNgorCW1vdmxvCVxvcmRlciwgIzAKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDgpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzgKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzgKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDQpCisJbW92aHMJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzQKKwlhZGRocwlcb3JkZXIsIFxvcmRlciwgIzQKKworCWNtcAlcZGl2aXNvciwgIygxIDw8IDIpCisJYWRkaGkJXG9yZGVyLCBcb3JkZXIsICMzCisJYWRkbHMJXG9yZGVyLCBcb3JkZXIsIFxkaXZpc29yLCBsc3IgIzEKKworI2VuZGlmCisKKy5lbmRtCisKKwkuYWxpZ24JNQorLmdsb2JsIF9fZGl2c2kzCisuZ2xvYmwgX19hZWFiaV9pZGl2CitfX2RpdnNpMzoKK19fYWVhYmlfaWRpdjoKKwljbXAJcjEsICMwCisJZW9yCWlwLCByMCwgcjEJCQlAIHNhdmUgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdC4KKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJc3VicwlyMiwgcjEsICMxCQkJQCBkaXZpc2lvbiBieSAxIG9yIC0xID8KKwliZXEJMTBmCisJbW92cwlyMywgcjAKKwlyc2JtaQlyMywgcjAsICMwCQkJQCBwb3NpdGl2ZSBkaXZpZGVuZCB2YWx1ZQorCWNtcAlyMywgcjEKKwlibHMJMTFmCisJdHN0CXIxLCByMgkJCQlAIGRpdmlzb3IgaXMgcG93ZXIgb2YgMiA/CisJYmVxCTEyZgorCisJQVJNX0RJVl9CT0RZIHIzLCByMSwgcjAsIHIyCisKKwljbXAJaXAsICMwCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworMTA6CXRlcQlpcCwgcjAJCQkJQCBzYW1lIHNpZ24gPworCXJzYm1pCXIwLCByMCwgIzAKKwltb3YJcGMsIGxyCisKKzExOgltb3ZsbwlyMCwgIzAKKwltb3ZlcQlyMCwgaXAsIGFzciAjMzEKKwlvcnJlcQlyMCwgcjAsICMxCisJbW92CXBjLCBscgorCisxMjoJQVJNX0RJVjJfT1JERVIgcjEsIHIyCisKKwljbXAJaXAsICMwCisJbW92CXIwLCByMywgbHNyIHIyCisJcnNibWkJcjAsIHIwLCAjMAorCW1vdglwYywgbHIKKworTGRpdjA6CisKKwlzdHIJbHIsIFtzcCwgIy00XSEKKwlibAlfX2RpdjAKKwltb3YJcjAsICMwCQkJQCBBYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZS4KKwlsZHIJcGMsIFtzcF0sICM0CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvX2xzaHJkaTMuUyBiL3gtbG9hZGVyL2xpYi9fbHNocmRpMy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmE3OTkKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvX2xzaHJkaTMuUwpAQCAtMCwwICsxLDQ4IEBACisvKiBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKK2xhdGVyIHZlcnNpb24uCisKK0luIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzIHlvdSB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBsaW5rIHRoZQorY29tcGlsZWQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaW50byBjb21iaW5hdGlvbnMgd2l0aCBvdGhlciBwcm9ncmFtcywKK2FuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKK2Zyb20gdGhlIHVzZSBvZiB0aGlzIGZpbGUuICAoVGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmVzdHJpY3Rpb25zCitkbyBhcHBseSBpbiBvdGhlciByZXNwZWN0czsgZm9yIGV4YW1wbGUsIHRoZXkgY292ZXIgbW9kaWZpY2F0aW9uIG9mCit0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKK2V4ZWN1dGFibGUuKQorCitUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CitXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCitNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKK0Jvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KKworCisjaWZkZWYgX19BUk1FQl9fCisjZGVmaW5lIGFsIHIxCisjZGVmaW5lIGFoIHIwCisjZWxzZQorI2RlZmluZSBhbCByMAorI2RlZmluZSBhaCByMQorI2VuZGlmCisKKy5nbG9ibCBfX2xzaHJkaTMKKy5nbG9ibCBfX2FlYWJpX2xsc3IKK19fbHNocmRpMzoKK19fYWVhYmlfbGxzcjoKKworCXN1YnMJcjMsIHIyLCAjMzIKKwlyc2IJaXAsIHIyLCAjMzIKKwltb3ZtaQlhbCwgYWwsIGxzciByMgorCW1vdnBsCWFsLCBhaCwgbHNyIHIzCisJb3JybWkJYWwsIGFsLCBhaCwgbHNsIGlwCisJbW92CWFoLCBhaCwgbHNyIHIyCisJbW92CXBjLCBscgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL19tb2RzaTMuUyBiL3gtbG9hZGVyL2xpYi9fbW9kc2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5YzU4NAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fbW9kc2kzLlMKQEAgLTAsMCArMSw5OSBAQAorCisubWFjcm8gQVJNX01PRF9CT0RZIGRpdmlkZW5kLCBkaXZpc29yLCBvcmRlciwgc3BhcmUKKworI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA1CisKKwljbHoJXG9yZGVyLCBcZGl2aXNvcgorCWNseglcc3BhcmUsIFxkaXZpZGVuZAorCXN1Yglcb3JkZXIsIFxvcmRlciwgXHNwYXJlCisJbW92CVxkaXZpc29yLCBcZGl2aXNvciwgbHNsIFxvcmRlcgorCisjZWxzZQorCisJbW92CVxvcmRlciwgIzAKKworCUAgVW5sZXNzIHRoZSBkaXZpc29yIGlzIHZlcnkgYmlnLCBzaGlmdCBpdCB1cCBpbiBtdWx0aXBsZXMgb2YKKwlAIGZvdXIgYml0cywgc2luY2UgdGhpcyBpcyB0aGUgYW1vdW50IG9mIHVud2luZGluZyBpbiB0aGUgbWFpbgorCUAgZGl2aXNpb24gbG9vcC4gIENvbnRpbnVlIHNoaWZ0aW5nIHVudGlsIHRoZSBkaXZpc29yIGlzCisJQCBsYXJnZXIgdGhhbiB0aGUgZGl2aWRlbmQuCisxOgljbXAJXGRpdmlzb3IsICMweDEwMDAwMDAwCisJY21wbG8JXGRpdmlzb3IsIFxkaXZpZGVuZAorCW1vdmxvCVxkaXZpc29yLCBcZGl2aXNvciwgbHNsICM0CisJYWRkbG8JXG9yZGVyLCBcb3JkZXIsICM0CisJYmxvCTFiCisKKwlAIEZvciB2ZXJ5IGJpZyBkaXZpc29ycywgd2UgbXVzdCBzaGlmdCBpdCBhIGJpdCBhdCBhIHRpbWUsIG9yCisJQCB3ZSB3aWxsIGJlIGluIGRhbmdlciBvZiBvdmVyZmxvd2luZy4KKzE6CWNtcAlcZGl2aXNvciwgIzB4ODAwMDAwMDAKKwljbXBsbwlcZGl2aXNvciwgXGRpdmlkZW5kCisJbW92bG8JXGRpdmlzb3IsIFxkaXZpc29yLCBsc2wgIzEKKwlhZGRsbwlcb3JkZXIsIFxvcmRlciwgIzEKKwlibG8JMWIKKworI2VuZGlmCisKKwlAIFBlcmZvcm0gYWxsIG5lZWRlZCBzdWJzdHJhY3Rpb25zIHRvIGtlZXAgb25seSB0aGUgcmVtaW5kZXIuCisJQCBEbyBjb21wYXJpc29ucyBpbiBiYXRjaCBvZiA0IGZpcnN0LgorCXN1YnMJXG9yZGVyLCBcb3JkZXIsICMzCQlAIHllcywgMyBpcyBpbnRlbmRlZCBoZXJlCisJYmx0CTJmCisKKzE6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJY21wCVxkaXZpZGVuZCwgXGRpdmlzb3IsICBsc3IgIzEKKwlzdWJocwlcZGl2aWRlbmQsIFxkaXZpZGVuZCwgXGRpdmlzb3IsIGxzciAjMQorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yLCAgbHNyICMyCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yLCBsc3IgIzIKKwljbXAJXGRpdmlkZW5kLCBcZGl2aXNvciwgIGxzciAjMworCXN1YmhzCVxkaXZpZGVuZCwgXGRpdmlkZW5kLCBcZGl2aXNvciwgbHNyICMzCisJY21wCVxkaXZpZGVuZCwgIzEKKwltb3YJXGRpdmlzb3IsIFxkaXZpc29yLCBsc3IgIzQKKwlzdWJnZXMJXG9yZGVyLCBcb3JkZXIsICM0CisJYmdlCTFiCisKKwl0c3QJXG9yZGVyLCAjMworCXRlcW5lCVxkaXZpZGVuZCwgIzAKKwliZXEJNWYKKworCUAgRWl0aGVyIDEsIDIgb3IgMyBjb21wYXJpc29uL3N1YnN0cmFjdGlvbnMgYXJlIGxlZnQuCisyOgljbW4JXG9yZGVyLCAjMgorCWJsdAk0ZgorCWJlcQkzZgorCWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJbW92CVxkaXZpc29yLCAgXGRpdmlzb3IsICBsc3IgIzEKKzM6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCisJbW92CVxkaXZpc29yLCAgXGRpdmlzb3IsICBsc3IgIzEKKzQ6CWNtcAlcZGl2aWRlbmQsIFxkaXZpc29yCisJc3ViaHMJXGRpdmlkZW5kLCBcZGl2aWRlbmQsIFxkaXZpc29yCis1OgorLmVuZG0KKworCS5hbGlnbgk1CisuZ2xvYmwgX19tb2RzaTMKK19fbW9kc2kzOgorCWNtcAlyMSwgIzAKKwliZXEJTGRpdjAKKwlyc2JtaQlyMSwgcjEsICMwCQkJQCBsb29wcyBiZWxvdyB1c2UgdW5zaWduZWQuCisJbW92cwlpcCwgcjAJCQkJQCBwcmVzZXJ2ZSBzaWduIG9mIGRpdmlkZW5kCisJcnNibWkJcjAsIHIwLCAjMAkJCUAgaWYgbmVnYXRpdmUgbWFrZSBwb3NpdGl2ZQorCXN1YnMJcjIsIHIxLCAjMQkJCUAgY29tcGFyZSBkaXZpc29yIHdpdGggMQorCWNtcG5lCXIwLCByMQkJCQlAIGNvbXBhcmUgZGl2aWRlbmQgd2l0aCBkaXZpc29yCisJbW92ZXEJcjAsICMwCisJdHN0aGkJcjEsIHIyCQkJCUAgc2VlIGlmIGRpdmlzb3IgaXMgcG93ZXIgb2YgMgorCWFuZGVxCXIwLCByMCwgcjIKKwlibHMJMTBmCisKKwlBUk1fTU9EX0JPRFkgcjAsIHIxLCByMiwgcjMKKworMTA6CWNtcAlpcCwgIzAKKwlyc2JtaQlyMCwgcjAsICMwCisJbW92CXBjLCBscgorCisKK0xkaXYwOgorCisJc3RyCWxyLCBbc3AsICMtNF0hCisJYmwJX19kaXYwCisJbW92CXIwLCAjMAkJCUAgQWJvdXQgYXMgd3JvbmcgYXMgaXQgY291bGQgYmUuCisJbGRyCXBjLCBbc3BdLCAjNApkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL191ZGl2c2kzLlMgYi94LWxvYWRlci9saWIvX3VkaXZzaTMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2RjZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL191ZGl2c2kzLlMKQEAgLTAsMCArMSw3NyBAQAorLyogIyAxICJsaWJnY2MxLlMiICovCitAIGxpYmdjYzEgcm91dGluZXMgZm9yIEFSTSBjcHUuCitAIERpdmlzaW9uIHJvdXRpbmVzLCB3cml0dGVuIGJ5IFJpY2hhcmQgRWFybnNoYXcsIChyZWFybnNoYUBhcm1sdGQuY28udWspCitkaXZpZGVuZAkucmVxCXIwCitkaXZpc29yCQkucmVxCXIxCityZXN1bHQJCS5yZXEJcjIKK2N1cmJpdAkJLnJlcQlyMworLyogaXAJCS5yZXEJcjEyCSovCisvKiBzcAkJLnJlcQlyMTMJKi8KKy8qIGxyCQkucmVxCXIxNAkqLworLyogcGMJCS5yZXEJcjE1CSovCisJLnRleHQKKwkuZ2xvYmwJIF9fdWRpdnNpMworCS50eXBlICBfX3VkaXZzaTMgICAgICAgLGZ1bmN0aW9uCisJLmFsaWduCTAKKyBfX3VkaXZzaTMgICAgICA6CisJY21wCWRpdmlzb3IsICMwCisJYmVxCUxkaXYwCisJbW92CWN1cmJpdCwgIzEKKwltb3YJcmVzdWx0LCAjMAorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCWJjYwlMZ290X3Jlc3VsdAorTG9vcDE6CisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKwljbXAJZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjNAorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzQKKwliY2MJTG9vcDEKK0xiaWdudW06CisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisJY21wCWRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzEKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICMxCisJYmNjCUxiaWdudW0KK0xvb3AzOgorCUAgVGVzdCBmb3IgcG9zc2libGUgc3VidHJhY3Rpb25zLCBhbmQgbm90ZSB3aGljaCBiaXRzCisJQCBhcmUgZG9uZSBpbiB0aGUgcmVzdWx0LiAgT24gdGhlIGZpbmFsIHBhc3MsIHRoaXMgbWF5IHN1YnRyYWN0CisJQCB0b28gbXVjaCBmcm9tIHRoZSBkaXZpZGVuZCwgYnV0IHRoZSByZXN1bHQgd2lsbCBiZSBvaywgc2luY2UgdGhlCisJQCAiYml0IiB3aWxsIGhhdmUgYmVlbiBzaGlmdGVkIG91dCBhdCB0aGUgYm90dG9tLgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvcgorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvcgorCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJb3JyY3MJcmVzdWx0LCByZXN1bHQsIGN1cmJpdCwgbHNyICMxCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCW9ycmNzCXJlc3VsdCwgcmVzdWx0LCBjdXJiaXQsIGxzciAjMgorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMzCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlvcnJjcwlyZXN1bHQsIHJlc3VsdCwgY3VyYml0LCBsc3IgIzMKKwljbXAJZGl2aWRlbmQsICMwCQkJQCBFYXJseSB0ZXJtaW5hdGlvbj8KKwltb3ZuZXMJY3VyYml0LCBjdXJiaXQsIGxzciAjNAkJQCBObywgYW55IG1vcmUgYml0cyB0byBkbz8KKwltb3ZuZQlkaXZpc29yLCBkaXZpc29yLCBsc3IgIzQKKwlibmUJTG9vcDMKK0xnb3RfcmVzdWx0OgorCW1vdglyMCwgcmVzdWx0CisJbW92IAlwYywgbHIKK0xkaXYwOgorCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCSBfX2RpdjAgICAgICAgKFBMVCkKKwltb3YJcjAsICMwCQkJQCBhYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZQorCWxkbWlhCXNwISwge3BjfQorCS5zaXplICBfX3VkaXZzaTMgICAgICAgLCAuIC0gIF9fdWRpdnNpMworLyogIyAyMzUgImxpYmdjYzEuUyIgKi8KKy8qICMgMzIwICJsaWJnY2MxLlMiICovCisvKiAjIDQyMSAibGliZ2NjMS5TIiAqLworLyogIyA0MzMgImxpYmdjYzEuUyIgKi8KKy8qICMgNDU2ICJsaWJnY2MxLlMiICovCisvKiAjIDUwMCAibGliZ2NjMS5TIiAqLworLyogIyA1ODAgImxpYmdjYzEuUyIgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9fdW1vZHNpMy5TIGIveC1sb2FkZXIvbGliL191bW9kc2kzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhZWJlOAotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9fdW1vZHNpMy5TCkBAIC0wLDAgKzEsODggQEAKKy8qICMgMSAibGliZ2NjMS5TIiAqLworQCBsaWJnY2MxIHJvdXRpbmVzIGZvciBBUk0gY3B1LgorQCBEaXZpc2lvbiByb3V0aW5lcywgd3JpdHRlbiBieSBSaWNoYXJkIEVhcm5zaGF3LCAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQorLyogIyAxNDUgImxpYmdjYzEuUyIgKi8KK2RpdmlkZW5kCS5yZXEJcjAKK2Rpdmlzb3IJCS5yZXEJcjEKK292ZXJkb25lCS5yZXEJcjIKK2N1cmJpdAkJLnJlcQlyMworLyogaXAJCS5yZXEJcjEyCSovCisvKiBzcAkJLnJlcQlyMTMJKi8KKy8qIGxyCQkucmVxCXIxNAkqLworLyogcGMJCS5yZXEJcjE1CSovCisJLnRleHQKKwkuZ2xvYmwJIF9fdW1vZHNpMworCS50eXBlICBfX3Vtb2RzaTMgICAgICAgLGZ1bmN0aW9uCisJLmFsaWduIDAKKyBfX3Vtb2RzaTMgICAgICA6CisJY21wCWRpdmlzb3IsICMwCisJYmVxCUxkaXYwCisJbW92CWN1cmJpdCwgIzEKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwltb3ZjYyAgCXBjLCBscgorTG9vcDE6CisJQCBVbmxlc3MgdGhlIGRpdmlzb3IgaXMgdmVyeSBiaWcsIHNoaWZ0IGl0IHVwIGluIG11bHRpcGxlcyBvZgorCUAgZm91ciBiaXRzLCBzaW5jZSB0aGlzIGlzIHRoZSBhbW91bnQgb2YgdW53aW5kaW5nIGluIHRoZSBtYWluCisJQCBkaXZpc2lvbiBsb29wLiAgQ29udGludWUgc2hpZnRpbmcgdW50aWwgdGhlIGRpdmlzb3IgaXMKKwlAIGxhcmdlciB0aGFuIHRoZSBkaXZpZGVuZC4KKwljbXAJZGl2aXNvciwgIzB4MTAwMDAwMDAKKwljbXBjYwlkaXZpc29yLCBkaXZpZGVuZAorCW1vdmNjCWRpdmlzb3IsIGRpdmlzb3IsIGxzbCAjNAorCW1vdmNjCWN1cmJpdCwgY3VyYml0LCBsc2wgIzQKKwliY2MJTG9vcDEKK0xiaWdudW06CisJQCBGb3IgdmVyeSBiaWcgZGl2aXNvcnMsIHdlIG11c3Qgc2hpZnQgaXQgYSBiaXQgYXQgYSB0aW1lLCBvcgorCUAgd2Ugd2lsbCBiZSBpbiBkYW5nZXIgb2Ygb3ZlcmZsb3dpbmcuCisJY21wCWRpdmlzb3IsICMweDgwMDAwMDAwCisJY21wY2MJZGl2aXNvciwgZGl2aWRlbmQKKwltb3ZjYwlkaXZpc29yLCBkaXZpc29yLCBsc2wgIzEKKwltb3ZjYwljdXJiaXQsIGN1cmJpdCwgbHNsICMxCisJYmNjCUxiaWdudW0KK0xvb3AzOgorCUAgVGVzdCBmb3IgcG9zc2libGUgc3VidHJhY3Rpb25zLiAgT24gdGhlIGZpbmFsIHBhc3MsIHRoaXMgbWF5CisJQCBzdWJ0cmFjdCB0b28gbXVjaCBmcm9tIHRoZSBkaXZpZGVuZCwgc28ga2VlcCB0cmFjayBvZiB3aGljaAorCUAgc3VidHJhY3Rpb25zIGFyZSBkb25lLCB3ZSBjYW4gZml4IHRoZW0gdXAgYWZ0ZXJ3YXJkcy4uLgorCW1vdglvdmVyZG9uZSwgIzAKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IKKwljbXAJZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMQorCXN1YmNzCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJb3JyY3MJb3ZlcmRvbmUsIG92ZXJkb25lLCBjdXJiaXQsIHJvciAjMQorCWNtcAlkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMyCisJc3ViY3MJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzIKKwlvcnJjcwlvdmVyZG9uZSwgb3ZlcmRvbmUsIGN1cmJpdCwgcm9yICMyCisJY21wCWRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwlzdWJjcwlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMworCW9ycmNzCW92ZXJkb25lLCBvdmVyZG9uZSwgY3VyYml0LCByb3IgIzMKKwltb3YJaXAsIGN1cmJpdAorCWNtcAlkaXZpZGVuZCwgIzAJCQlAIEVhcmx5IHRlcm1pbmF0aW9uPworCW1vdm5lcwljdXJiaXQsIGN1cmJpdCwgbHNyICM0CQlAIE5vLCBhbnkgbW9yZSBiaXRzIHRvIGRvPworCW1vdm5lCWRpdmlzb3IsIGRpdmlzb3IsIGxzciAjNAorCWJuZQlMb29wMworCUAgQW55IHN1YnRyYWN0aW9ucyB0aGF0IHdlIHNob3VsZCBub3QgaGF2ZSBkb25lIHdpbGwgYmUgcmVjb3JkZWQgaW4KKwlAIHRoZSB0b3AgdGhyZWUgYml0cyBvZiAib3ZlcmRvbmUiLiAgRXhhY3RseSB3aGljaCB3ZXJlIG5vdCBuZWVkZWQKKwlAIGFyZSBnb3Zlcm5lZCBieSB0aGUgcG9zaXRpb24gb2YgdGhlIGJpdCwgc3RvcmVkIGluIGlwLgorCUAgSWYgd2UgdGVybWluYXRlZCBlYXJseSwgYmVjYXVzZSBkaXZpZGVuZCBiZWNhbWUgemVybywKKwlAIHRoZW4gbm9uZSBvZiB0aGUgYmVsb3cgd2lsbCBtYXRjaCwgc2luY2UgdGhlIGJpdCBpbiBpcCB3aWxsIG5vdCBiZQorCUAgaW4gdGhlIGJvdHRvbSBuaWJibGUuCisJYW5kcwlvdmVyZG9uZSwgb3ZlcmRvbmUsICMweGUwMDAwMDAwCisJbW92ZXEgIAlwYywgbHIJCQkJQCBObyBmaXh1cHMgbmVlZGVkCisJdHN0CW92ZXJkb25lLCBpcCwgcm9yICMzCisJYWRkbmUJZGl2aWRlbmQsIGRpdmlkZW5kLCBkaXZpc29yLCBsc3IgIzMKKwl0c3QJb3ZlcmRvbmUsIGlwLCByb3IgIzIKKwlhZGRuZQlkaXZpZGVuZCwgZGl2aWRlbmQsIGRpdmlzb3IsIGxzciAjMgorCXRzdAlvdmVyZG9uZSwgaXAsIHJvciAjMQorCWFkZG5lCWRpdmlkZW5kLCBkaXZpZGVuZCwgZGl2aXNvciwgbHNyICMxCisJbW92IAlwYywgbHIKK0xkaXYwOgorCXN0cglsciwgW3NwLCAjLTRdIQorCWJsCSBfX2RpdjAgICAgICAgKFBMVCkKKwltb3YJcjAsICMwCQkJQCBhYm91dCBhcyB3cm9uZyBhcyBpdCBjb3VsZCBiZQorCWxkbWlhCXNwISwge3BjfQorCS5zaXplICBfX3Vtb2RzaTMgICAgICAgLCAuIC0gIF9fdW1vZHNpMworLyogIyAzMjAgImxpYmdjYzEuUyIgKi8KKy8qICMgNDIxICJsaWJnY2MxLlMiICovCisvKiAjIDQzMyAibGliZ2NjMS5TIiAqLworLyogIyA0NTYgImxpYmdjYzEuUyIgKi8KKy8qICMgNTAwICJsaWJnY2MxLlMiICovCisvKiAjIDU4MCAibGliZ2NjMS5TIiAqLwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2JvYXJkLmMgYi94LWxvYWRlci9saWIvYm9hcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkzNTg0Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2JvYXJkLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0CisgKiBKaWFuIFpoYW5nLCBUZXhhcyBJbnN0cnVtZW50cywganpoYW5nQHRpLmNvbS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDItMjAwNgorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxib290bS5oPgorI2luY2x1ZGUgPHBhcnQuaD4KKyNpbmNsdWRlIDxmYXQuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPG1tYy5oPgorI2luY2x1ZGUgPHRpbWVzdGFtcC5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tZW0uaD4KKworLyoKKyAqIFByZXByb2Nlc3NvciBEZWZpbml0aW9ucworICovCisjaWZuZGVmIENPTkZJR19JREVOVF9TVFJJTkcKKyNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORyAiIgorI2VuZGlmCisKKy8qIFR5cGUgRGVmaW5pdGlvbiAqLworCit0eXBlZGVmIGludCAoaW5pdF9mbmNfdCkodm9pZCk7CisKKy8qCisgKiBGdW5jdGlvbiBQcm90b3R5cGVzCisgKi8KK2V4dGVybiBpbnQgbWlzY19pbml0X3IgKHZvaWQpOworZXh0ZXJuIGludCBtbWNfaW5pdChpbnQgdmVyYm9zZSk7CitleHRlcm4gYmxvY2tfZGV2X2Rlc2NfdCAqbW1jX2dldF9kZXYoaW50IGRldik7CitleHRlcm4gaW50IGdldF9ib290X2RldmljZXNfbGlzdChjb25zdCB1MzIqKiBkZXZpY2VzX2xpc3QpOworCisvKgorICogR2xvYmFsIFZhcmlhYmxlcworICovCitjb25zdCBjaGFyIHZlcnNpb25fc3RyaW5nW10gPQorCVhfTE9BREVSX1ZFUlNJT04iICgiIFhfTE9BREVSX0RBVEUgIiAtICIgWF9MT0FERVJfVElNRSAiKSJDT05GSUdfSURFTlRfU1RSSU5HOworCitpbml0X2ZuY190ICppbml0X3NlcXVlbmNlW10gPSB7CisJY3B1X2luaXQsCQkvKiBiYXNpYyBjcHUgZGVwZW5kZW50IHNldHVwICovCisJYm9hcmRfaW5pdCwJCS8qIGJhc2ljIGJvYXJkIGRlcGVuZGVudCBzZXR1cCAqLworI2lmZGVmIENGR19QUklOVEYKKyAJc2VyaWFsX2luaXQsCQkvKiBzZXJpYWwgY29tbXVuaWNhdGlvbnMgc2V0dXAgKi8KKwlkaXNwbGF5X29wdGlvbnMsCisjZW5kaWYKKyAgCW5hbmRfaW5pdCwJCS8qIGJvYXJkIHNwZWNpZmljIG5hbmQgaW5pdCAqLworICAJTlVMTCwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2xvYWRfcGFyYW1zKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgY29uc3QgaW50ICppbmRleCwgaW50IGNvdW50KQoreworCWlmIChidWZmZXIgPT0gTlVMTCB8fCBpbmRleCA9PSBOVUxMIHx8IGNvdW50ID09IDAgfHwgKmluZGV4IDwgQk9PVE1fSU5ERVhfU1RBUlQgfHwgKmluZGV4ID49IGNvdW50KSB7CisJCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworCX0KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX1NVQ0NFU1MpOworfQorCisjaWYgKGRlZmluZWQoQ0ZHX01NQ19PTkVOQU5EKSB8fCBkZWZpbmVkIChDRkdfTU1DX05BTkQpKSAmJiBkZWZpbmVkKENGR19DTURfRkFUKQorLyoKKyAqICBpbnQgZmF0X2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gdGhlIGZpcnN0IGluaXRpYWxpemVkCisgKiAgICBNdWx0aW1lZGlhIENhcmQgKE1NQykgZGV2aWNlLCBvbmUgb2Ygb25lIG9yIG1vcmUgZGVzaWduYXRlZAorICogICAgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBmcm9tIHRoZSBhIEZBVCBmaWxlIHN5c3RlbSBvbgorICogICAgdGhlIGZpcnN0IHBhcnRpdGlvbiBvZiBhIE1hc3RlciBCb290IFJlY29yZCB2b2x1bWUuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIGJvb3QgZmlsZSB0byBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byB0aGUgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVyLgorICogICAgaW5kZXggIC0gQSBwb2ludGVyIHRvIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBib290IGZpbGUgdG8KKyAqICAgICAgICAgICAgIGF0dGVtcHQgdG8gbG9hZC4KKyAqCisgKiAgUmV0dXJuczoKKyAqICAgIEJPT1RNX1NUQVRVU19TVUNDRVNTIG9uIHN1Y2Nlc3M7IG90aGVyd2lzZSwgQk9PVE1fU1RBVFVTX0ZBSUxVUkUKKyAqICAgIG9uIGVycm9yLgorICoKKyAqLworc3RhdGljIGludCBmYXRfbG9hZCh1aW50OF90ICpidWZmZXIsIGludCAqaW5kZXgpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQk9PVEZJTEUpCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7IENPTkZJR19CT09URklMRSB9OworI2VsaWYgZGVmaW5lZChDT05GSUdfQk9PVEZJTEVfTElTVCkgJiYgZGVmaW5lZChDT05GSUdfQk9PVE1fSU1BR0UpCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSBDT05GSUdfQk9PVEZJTEVfTElTVDsKKyNlbHNlCisJY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19CT09URklMRSkgKi8KKwljb25zdCBjaGFyICogZmlsZSA9IE5VTEw7CisJY29uc3QgY2hhciAqIGZhaWx1cmUgPSBOVUxMOworCWNvbnN0IGludCBjb3VudCA9IEFSUkFZX1NJWkUoZmlsZXMpOworCWNvbnN0IGludCBkZXZpY2UgPSAwOworCWNvbnN0IGludCBwYXJ0aXRpb24gPSAxOworCWNvbnN0IGludCBtYXhzaXplID0gMDsKKwljb25zdCBpbnQgdmVyYm9zZSA9IDE7CisJbG9uZyBzaXplID0gMDsKKwlibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYyA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzdGF0dXMgPSAwOworCisJaWYgKCFjaGVja19sb2FkX3BhcmFtcyhidWZmZXIsIGluZGV4LCBjb3VudCkpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJZmlsZSA9IGZpbGVzWygqaW5kZXgpKytdOworCisJaWYgKCppbmRleCA+PSBjb3VudCkgeworCQkqaW5kZXggPSBCT09UTV9JTkRFWF9TVE9QOworCX0KKworCXN0YXR1cyA9IG1tY19pbml0KHZlcmJvc2UpOworCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWZhaWx1cmUgPSAiTU1DIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIjsKKwkJZ290byBmYWlsOworCX0KKworICAgIGRldl9kZXNjID0gbW1jX2dldF9kZXYoZGV2aWNlKTsKKworICAgIGlmIChkZXZfZGVzYyA9PSBOVUxMKSB7CisJCWZhaWx1cmUgPSAiQ291bGQgbm90IGFjY2VzcyBNTUMgZGV2aWNlXG4iOworCQlnb3RvIGZhaWw7CisgICAgfQorCisgICAgZmF0X3JlZ2lzdGVyX2RldmljZShkZXZfZGVzYywgcGFydGl0aW9uKTsKKworCXNpemUgPSBmaWxlX2ZhdF9yZWFkKGZpbGUsIGJ1ZmZlciwgbWF4c2l6ZSk7CisKKwlpZiAoc2l6ZSA9PSAtMSkgeworCQlwcmludGYoIkNvdWxkIG5vdCByZWFkIGZpbGUgXCIlc1wiXG4iLCBmaWxlKTsKKwkJZ290byBmYWlsOworCX0KKworCXByaW50ZigiXG4lbGQgYnl0ZXMgcmVhZFxuIiwgc2l6ZSk7CisKKwlwcmludGYoIkxvYWRpbmcgZnJvbSBNTUMlZCwgZmlsZSBcIiVzXCJcbiIsIGRldmljZSwgZmlsZSk7CisKKwlyZXR1cm4gKEJPT1RNX1NUQVRVU19TVUNDRVNTKTsKKworIGZhaWw6CisJaWYgKGZhaWx1cmUgIT0gTlVMTCkgeworCQlwdXRzKGZhaWx1cmUpOworCX0KKworCXJldHVybiAoQk9PVE1fU1RBVFVTX0ZBSUxVUkUpOworfQorI2VuZGlmIC8qIChkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZCAoQ0ZHX01NQ19OQU5EKSkgJiYgZGVmaW5lZChDRkdfQ01EX0ZBVCkgKi8KKworLyoKKyAqICBpbnQgYmxvY2tfbG9hZCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBhIGJsb2NrIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAgICAgLSBBIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHNlY29uZGFyeSBwcm9ncmFtCisgKiAgICAgICAgICAgICAgICAgbG9hZGVyLgorICogICAgaW5kZXggICAgICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgICAgIGxvYWQuCisgKiAgICBjb3VudCAgICAgIC0gVGhlIHRvdGFsIG51bWJlciBvZiBleHRlbnRzLgorICogICAgZXh0ZW50cyAgICAtIFRoZSBhcnJheSBvZiBib290IGZpbGUgZXh0ZW50cyB0byBhdHRlbXB0IHRvIGxvYWQuCisgKiAgICBkZXZpY2UgICAgIC0gQSBwb2ludGVyIHRvIGEgQyBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYmxvY2sgZGV2aWNlIAorICogICAgICAgICAgICAgICAgIGJlaW5nIGxvYWRlZCBmcm9tLgorICogICAgcmVhZCAgICAgICAtIEEgcG9pbnRlciB0byB0aGUgZGV2aWNlLXNwZWNpZmljIGZ1bmN0aW9uIHRoYXQgd2lsbAorICogICAgICAgICAgICAgICAgIHJlYWQgdGhlIGJsb2NrcyB0byBsb2FkLgorICogICAgYmxvY2tfc2l6ZSAtIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIGRldmljZSdzIGZ1bmRhbWVudGFsIHJlYWQKKyAqICAgICAgICAgICAgICAgICBibG9jayBzaXplLgorICogICAgCisgKgorICogIE91dHB1dChzKToKKyAqICAgIGJ1ZmZlciAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZGFyeSBwcm9ncmFtIGxvYWRlci4KKyAqICAgIGluZGV4ICAgICAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICAgICAgYXR0ZW1wdCB0byBsb2FkLgorICoKKyAqICBSZXR1cm5zOgorICogICAgQk9PVE1fU1RBVFVTX1NVQ0NFU1Mgb24gc3VjY2Vzczsgb3RoZXJ3aXNlLCBCT09UTV9TVEFUVVNfRkFJTFVSRQorICogICAgb24gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50IGJsb2NrX2xvYWQodWludDhfdCAqYnVmZmVyLCBpbnQgKmluZGV4LCBpbnQgY291bnQsIGNvbnN0IGJvb3RfZXh0ZW50X3QgZXh0ZW50c1tdLCBjb25zdCBjaGFyICpkZXZpY2UsIGludCAoKnJlYWQpKHVuc2lnbmVkIGNoYXIgKiwgdWxvbmcpLCB1bnNpZ25lZCBsb25nIGJsb2NrX3NpemUpCit7CisJY29uc3QgYm9vdF9leHRlbnRfdCAqZXh0ZW50ID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJaW50IHJlYWRfc3RhdHVzOworCisJaWYgKCFjaGVja19sb2FkX3BhcmFtcyhidWZmZXIsIGluZGV4LCBjb3VudCkpIHsKKwkJcmV0dXJuIChCT09UTV9TVEFUVVNfRkFJTFVSRSk7CisJfQorCisJZXh0ZW50ID0gJmV4dGVudHNbKCppbmRleCkrK107CisKKwlpZiAoKmluZGV4ID49IGNvdW50KSB7CisJCSppbmRleCA9IEJPT1RNX0lOREVYX1NUT1A7CisJfQorCisJZW5kID0gZXh0ZW50LT5zdGFydCArIGV4dGVudC0+c2l6ZSArIDE7CisKKwlmb3IgKGFkZHJlc3MgPSBleHRlbnQtPnN0YXJ0OyBhZGRyZXNzIDwgZW5kOyBhZGRyZXNzICs9IGJsb2NrX3NpemUpIHsKKwkJcmVhZF9zdGF0dXMgPSByZWFkKGJ1ZmZlciwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgCisJCS8qIElmIHN1Y2Nlc3NmdWwsIG1vdmUgdGhlIGRhdGEgcG9pbnRlci4gIElmIEVDQyBmYWlscywKKwkJICogcmVwb3J0IGZhaWx1cmUgdG8gY2FsbGVyLiAgSWYgc2tpcHBpbmcgYmFkIGJsb2NrLAorCQkgKiBqdXN0IGNvbnRpbnVlIGxvb3Bpbmcgd2l0aG91dCBtb3ZpbmcgdGhlIGRhdGEgcG9pbnRlci4KKwkJICovCisJCWlmIChyZWFkX3N0YXR1cyA9PSBOQU5EX1JFQURfU1VDQ0VTUykKKwkJeworCQkJYnVmZmVyICs9IGJsb2NrX3NpemU7CisJCX0KKwkJZWxzZSBpZiAocmVhZF9zdGF0dXMgPT0gTkFORF9SRUFEX0VDQ19GQUlMVVJFKQorCQl7CisJCQlyZXR1cm4gKEJPT1RNX1NUQVRVU19GQUlMVVJFKTsKKwkJfQorCX0KKworCXByaW50ZigiTG9hZGluZyBmcm9tICVzLCBvZmZzZXQgJSMwOGx4XG4iLCBkZXZpY2UsIGV4dGVudC0+c3RhcnQpOworCisJcmV0dXJuIChCT09UTV9TVEFUVVNfU1VDQ0VTUyk7Cit9CisKKyNpZiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpCisvKgorICogIGludCBvbmVuYW5kX2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gYSBPbmVOQU5EIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgb25lbmFuZF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQgfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX09ORU5BTkRfQk9PVEVYVEVOVF9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlRfTElTVDsKKyNlbHNlCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19PTkVOQU5EX0JPT1RFWFRFTlQpICovCisKKwlyZXR1cm4gYmxvY2tfbG9hZChidWZmZXIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgQVJSQVlfU0laRShleHRlbnRzKSwKKwkJCQkJICBleHRlbnRzLAorCQkJCQkgICJPbmVOQU5EIiwKKwkJCQkJICBvbmVuYW5kX3JlYWRfYmxvY2ssCisJCQkJCSAgT05FTkFORF9CTE9DS19TSVpFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpICovCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX05BTkQpCisvKgorICogIGludCBuYW5kX2xvYWQoKQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byByZWFkIGZyb20gYSBOQU5EIGRldmljZSBvbmUgb2Ygb25lIG9yCisgKiAgICBtb3JlIGRlc2lnbmF0ZWQgc2Vjb25kYXJ5IHByb2dyYW0gbG9hZGVycyAoU1BMKSBzcGVjaWZpZWQgYnkgdGhlCisgKiAgICBhcnJheSBvZiBibG9jayBleHRlbnRzLgorICoKKyAqICBJbnB1dChzKToKKyAqICAgIGJ1ZmZlciAtIEEgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgc2Vjb25kYXJ5IHByb2dyYW0KKyAqICAgICAgICAgICAgIGxvYWRlci4KKyAqICAgIGluZGV4ICAtIEEgcG9pbnRlciB0byB0aGUgaW5kZXggb2YgYm9vdCBleHRlbnQgdG8gYXR0ZW1wdCB0bworICogICAgICAgICAgICAgbG9hZC4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKiAgICBpbmRleCAgLSBBIHBvaW50ZXIgdG8gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJvb3QgZXh0ZW50IHRvCisgKiAgICAgICAgICAgICBhdHRlbXB0IHRvIGxvYWQuCisgKgorICogIFJldHVybnM6CisgKiAgICBCT09UTV9TVEFUVVNfU1VDQ0VTUyBvbiBzdWNjZXNzOyBvdGhlcndpc2UsIEJPT1RNX1NUQVRVU19GQUlMVVJFCisgKiAgICBvbiBlcnJvci4KKyAqCisgKi8KK3N0YXRpYyBpbnQgbmFuZF9sb2FkKHVpbnQ4X3QgKmJ1ZmZlciwgaW50ICppbmRleCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1RFWFRFTlQpCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IENPTkZJR19OQU5EX0JPT1RFWFRFTlQgfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX05BTkRfQk9PVEVYVEVOVF9MSVNUKSAmJiBkZWZpbmVkKENPTkZJR19CT09UTV9JTUFHRSkKKwljb25zdCBib290X2V4dGVudF90IGV4dGVudHNbXSA9IENPTkZJR19OQU5EX0JPT1RFWFRFTlRfTElTVDsKKyNlbHNlCisJY29uc3QgYm9vdF9leHRlbnRfdCBleHRlbnRzW10gPSB7IE5VTEwgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19OQU5EX0JPT1RFWFRFTlQpICovCisKKwlyZXR1cm4gYmxvY2tfbG9hZChidWZmZXIsCisJCQkJCSAgaW5kZXgsCisJCQkJCSAgQVJSQVlfU0laRShleHRlbnRzKSwKKwkJCQkJICBleHRlbnRzLAorCQkJCQkgICJOQU5EIiwKKwkJCQkJICBuYW5kX3JlYWRfYmxvY2ssCisJCQkJCSAgTkFORF9CTE9DS19TSVpFKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENGR19HUE1DX05BTkQpICovCisKKy8qCisgKiAgdm9pZCBkb19hcm1fYm9vdCgpCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgVGhpcyByb3V0aW5lIGF0dGVtcHRzIHRvIGJvb3QgdGhlIHN5c3RlbSBmcm9tIHRoZSBzcGVjaWZpZWQKKyAqICAgIGJvb3QgZGV2aWNlIGFmdGVyIGNvcHlpbmcgdGhlIHNlY29uZGFyeS1wcm9ncmFtIGxvYWRlciBpbnRvCisgKiAgICB0aGUgc3BlY2lmaWVkIG1lbW9yeSBidWZmZXIuCisgKgorICogIElucHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbQorICogICAgICAgICAgICAgbG9hZGVyLgorICogICAgdHlwZSAgIC0gVGhlIGJvb3QgZGV2aWNlIHRvIGJvb3QgZnJvbS4KKyAqCisgKiAgT3V0cHV0KHMpOgorICogICAgYnVmZmVyIC0gQSBwb2ludGVyIHRvIHRoZSBzZWNvbmRhcnkgcHJvZ3JhbSBsb2FkZXIuCisgKgorICogIFJldHVybnM6CisgKiAgICBOL0EKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGRvX2FybV9ib290KHVpbnQ4X3QgKmJ1ZmZlciwgdTMyIHR5cGUpCit7CisJaW50IGluZGV4ID0gQk9PVE1fSU5ERVhfU1RBUlQ7CisgCWludCBzdGF0dXMgPSBCT09UTV9TVEFUVVNfRkFJTFVSRTsKKwlkZXZpY2VfbG9hZCBsb2FkX2ltYWdlID0gTlVMTDsKKworCS8qIERldGVybWluZSwgYmFzZWQgb24gdGhlIGJvb3Qgc2V0dGluZywgdGhlIHNvdXJjZSB3ZSBhcmUgZ29pbmcKKwkgKiB0byBhdHRlbXB0IHRvIGJvb3QgZnJvbS4KKwkgKi8KKworCXN3aXRjaCAodHlwZSkgeworCisjaWYgKChkZWZpbmVkKENGR19NTUNfT05FTkFORCkgfHwgZGVmaW5lZCAoQ0ZHX01NQ19OQU5EKSkgJiYgZGVmaW5lZChDRkdfQ01EX0ZBVCkpCisJY2FzZSBNTUNfTkFORDoKKwljYXNlIE1NQ19PTkVOQU5EOgorCQlsb2FkX2ltYWdlID0gZmF0X2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX09ORU5BTkQpCisJY2FzZSBHUE1DX09ORU5BTkQ6CisJCWxvYWRfaW1hZ2UgPSBvbmVuYW5kX2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENGR19HUE1DX05BTkQpCisJY2FzZSBHUE1DX05BTkQ6CisJCWxvYWRfaW1hZ2UgPSBuYW5kX2xvYWQ7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisKKwl9CisKKwkvKiBBdHRlbXB0IHRvIGxvYWQgYW5kIGJvb3QgYW55IGNvbmZpZ3VyZWQgaW1hZ2VzIHVudGlsIHdlCisJICogc3VjY2Vzc2Z1bGx5IGJvb3Qgb3IgdW50aWwgd2UndmUgZXhoYXVzdGVkIGFsbCBwb3NzaWJsZSBpbWFnZXMuCisJICovCisKKwlkbyB7CisJCXN0YXR1cyA9IGxvYWRfaW1hZ2UoYnVmZmVyLCAmaW5kZXgpOworCisJCWlmIChib290bV9sb2FkX3N1Y2Nlc3NmdWwoc3RhdHVzKSkgeworCQkJc3RhdHVzID0gYm9vdG0oYnVmZmVyKTsKKwkJfQorCisJfSB3aGlsZSAoYm9vdG1fbG9hZF9jb250aW51ZShzdGF0dXMsIGluZGV4KSk7CitmYWlsOgorCXJldHVybjsKK30KKwordm9pZCBzdGFydF9hcm1ib290ICh2b2lkKQoreworCWNvbnN0IHUzMiogZGV2aWNlc19saXN0ID0gTlVMTDsKKwlpbnQgZGV2SWR4OworCWludCBib290X2RldmljZXNfY291bnQgPSBnZXRfYm9vdF9kZXZpY2VzX2xpc3QoJmRldmljZXNfbGlzdCk7CisJY29uc3QgY2hhciAqIGJvb3RfbmFtZSA9IE5VTEw7CisJaW5pdF9mbmNfdCAqKmluaXRfZm5jX3B0cjsKKwl1aW50OF90ICpidWZmZXIgPSAodWludDhfdCAqKUNGR19MT0FEQUREUjsKKworICAgCWZvciAoaW5pdF9mbmNfcHRyID0gaW5pdF9zZXF1ZW5jZTsgKmluaXRfZm5jX3B0cjsgKytpbml0X2ZuY19wdHIpIHsKKwkJaWYgKCgqaW5pdF9mbmNfcHRyKSgpICE9IDApIHsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCW1pc2NfaW5pdF9yKCk7CisKKwlmb3IoIGRldklkeCA9IDA7IGRldklkeCA8IGJvb3RfZGV2aWNlc19jb3VudDsgZGV2SWR4KysgKQorCXsKKwkJdTMyIGJvb3RfZGV2ID0gZGV2aWNlc19saXN0W2RldklkeF07CisJCXN3aXRjaCAoYm9vdF9kZXYpIHsKKworCQljYXNlIE1NQ19OQU5EOgorCQljYXNlIE1NQ19PTkVOQU5EOgorCQkJYm9vdF9uYW1lID0gIk1NQyI7CisJCQlicmVhazsKKworCQljYXNlIEdQTUNfT05FTkFORDoKKwkJCWJvb3RfbmFtZSA9ICJPbmVOQU5EIjsKKwkJCWJyZWFrOworCisJCWNhc2UgR1BNQ19OQU5EOgorCQkJYm9vdF9uYW1lID0gIk5BTkQiOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BFUklQSEVSQUw6CisJCQlib290X25hbWUgPSAiIjsKKwkJCXByaW50ZigiVHJ5aW5nIGxvYWQgZnJvbSBVU0JcbiIpOworCQkJZG9fdXNiKCk7ICAvKiBjaGVjayBmb3IgdXNiIGRvd25sb2FkICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJvb3RfbmFtZSA9ICI8dW5rbm93bj4iOworCQkJYnJlYWs7CisKKwkJfQorCisJCWRlYnVnKCJUcnlpbmcgWC1Mb2FkZXIgb24gJXNcbiIsIGJvb3RfbmFtZSk7CisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybi4gKi8KKwkJZG9fYXJtX2Jvb3QoYnVmZmVyLCBib290X2Rldik7CisJfQorCisJLyogSWYgZm9yIHNvbWUgcmVhc29uIGl0IGRvZXMsIHdlIGhhdmUgb25seSBvbmUgY2hvaWNlLCBoYW5nLiAqLworCXB1dHMoIkltYWdlcyBleGhhdXN0ZWRcbiIpOworZmFpbDoKKwloYW5nKCk7Cit9CisKK3ZvaWQgaGFuZyAodm9pZCkKK3sKKwkvKiBjYWxsIGJvYXJkIHNwZWNpZmljIGhhbmcgZnVuY3Rpb24gKi8KKwlib2FyZF9oYW5nKCk7CisKKwkvKiBpZiBib2FyZF9oYW5nKCkgcmV0dXJucywgaGFuZ2UgaGVyZSAqLworCXB1dHMoIlgtTG9hZGVyIGhhbmdzXG4iKTsKKworCWZvciAoOzspOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2Jvb3RtLmMgYi94LWxvYWRlci9saWIvYm9vdG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAxMzIxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2Jvb3RtLmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDIKKyAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgorICogTWFyaXVzIEdyb2VnZXIgPG1ncm9lZ2VyQHN5c2dvLmRlPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgRXJpayBNb3V3IChKLkEuSy5Nb3V3QGl0cy50dWRlbGZ0Lm5sKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3CSBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPHUtYm9vdC96bGliLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorc3RhdGljIHZvaWQgc2V0dXBfc3RhcnRfdGFnIChiZF90ICpiZCk7CisKKyMgaWZkZWYgQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTCitzdGF0aWMgdm9pZCBzZXR1cF9tZW1vcnlfdGFncyAoYmRfdCAqYmQpOworIyBlbmRpZgorc3RhdGljIHZvaWQgc2V0dXBfY29tbWFuZGxpbmVfdGFnIChiZF90ICpiZCwgY2hhciAqY29tbWFuZGxpbmUpOworCisjIGlmZGVmIENPTkZJR19JTklUUkRfVEFHCitzdGF0aWMgdm9pZCBzZXR1cF9pbml0cmRfdGFnIChiZF90ICpiZCwgdWxvbmcgaW5pdHJkX3N0YXJ0LAorCQkJICAgICAgdWxvbmcgaW5pdHJkX2VuZCk7CisjIGVuZGlmCitzdGF0aWMgdm9pZCBzZXR1cF9lbmRfdGFnIChiZF90ICpiZCk7CisKK3N0YXRpYyBzdHJ1Y3QgdGFnICpwYXJhbXM7CisjZW5kaWYgLyogQ09ORklHX1NFVFVQX01FTU9SWV9UQUdTIHx8IENPTkZJR19DTURMSU5FX1RBRyB8fCBDT05GSUdfSU5JVFJEX1RBRyAqLworCitpbnQgZG9fYm9vdG1fbGludXgoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLCBib290bV9oZWFkZXJzX3QgKmltYWdlcykKK3sKKwliZF90CSpiZCA9IGdkLT5iZDsKKwljaGFyCSpzOworCWludAltYWNoaWQgPSBiZC0+YmlfYXJjaF9udW1iZXI7CisJdm9pZAkoKnRoZUtlcm5lbCkoaW50IHplcm8sIGludCBhcmNoLCB1aW50IHBhcmFtcyk7CisKKyNpZmRlZiBDT05GSUdfQ01ETElORV9UQUcKKwljaGFyICpjb21tYW5kbGluZSA9IGdldGVudiAoImJvb3RhcmdzIik7CisjZW5kaWYKKworCWlmICgoZmxhZyAhPSAwKSAmJiAoZmxhZyAhPSBCT09UTV9TVEFURV9PU19HTykpCisJCXJldHVybiAxOworCisJdGhlS2VybmVsID0gKHZvaWQgKCopKGludCwgaW50LCB1aW50KSlpbWFnZXMtPmVwOworCisJcyA9IGdldGVudiAoIm1hY2hpZCIpOworCWlmIChzKSB7CisJCW1hY2hpZCA9IHNpbXBsZV9zdHJ0b3VsIChzLCBOVUxMLCAxNik7CisJCXByaW50ZiAoIlVzaW5nIG1hY2hpZCAweCV4IGZyb20gZW52aXJvbm1lbnRcbiIsIG1hY2hpZCk7CisJfQorCisJc2hvd19ib290X3Byb2dyZXNzICgxNSk7CisKKwlkZWJ1ZyAoIiMjIFRyYW5zZmVycmluZyBjb250cm9sIHRvIExpbnV4IChhdCBhZGRyZXNzICUwOGx4KSAuLi5cbiIsCisJICAgICAgICh1bG9uZykgdGhlS2VybmVsKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorCXNldHVwX3N0YXJ0X3RhZyAoYmQpOworI2lmZGVmIENPTkZJR19TRVJJQUxfVEFHCisJc2V0dXBfc2VyaWFsX3RhZyAoJnBhcmFtcyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkVWSVNJT05fVEFHCisJc2V0dXBfcmV2aXNpb25fdGFnICgmcGFyYW1zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworCXNldHVwX21lbW9yeV90YWdzIChiZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ01ETElORV9UQUcKKwlzZXR1cF9jb21tYW5kbGluZV90YWcgKGJkLCBjb21tYW5kbGluZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworCWlmIChpbWFnZXMtPnJkX3N0YXJ0ICYmIGltYWdlcy0+cmRfZW5kKQorCQlzZXR1cF9pbml0cmRfdGFnIChiZCwgaW1hZ2VzLT5yZF9zdGFydCwgaW1hZ2VzLT5yZF9lbmQpOworI2VuZGlmCisJc2V0dXBfZW5kX3RhZyAoYmQpOworI2VuZGlmCisKKwkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUga2VybmVsIGlzIGluIHBsYWNlICovCisJcHJpbnRmICgiXG5TdGFydGluZyBrZXJuZWwgLi4uXG5cbiIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERVZJQ0UKKwl7CisJCWV4dGVybiB2b2lkIHVkY19kaXNjb25uZWN0ICh2b2lkKTsKKwkJdWRjX2Rpc2Nvbm5lY3QgKCk7CisJfQorI2VuZGlmCisKKwljbGVhbnVwX2JlZm9yZV9saW51eCAoKTsKKworCXRoZUtlcm5lbCAoMCwgbWFjaGlkLCBiZC0+YmlfYm9vdF9wYXJhbXMpOworCS8qIGRvZXMgbm90IHJldHVybiAqLworCisJcmV0dXJuIDE7Cit9CisKKworI2lmIGRlZmluZWQgKENPTkZJR19TRVRVUF9NRU1PUllfVEFHUykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19DTURMSU5FX1RBRykgfHwgXAorICAgIGRlZmluZWQgKENPTkZJR19JTklUUkRfVEFHKSB8fCBcCisgICAgZGVmaW5lZCAoQ09ORklHX1NFUklBTF9UQUcpIHx8IFwKKyAgICBkZWZpbmVkIChDT05GSUdfUkVWSVNJT05fVEFHKQorc3RhdGljIHZvaWQgc2V0dXBfc3RhcnRfdGFnIChiZF90ICpiZCkKK3sKKwlwYXJhbXMgPSAoc3RydWN0IHRhZyAqKSBiZC0+YmlfYm9vdF9wYXJhbXM7CisKKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX0NPUkU7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfY29yZSk7CisKKwlwYXJhbXMtPnUuY29yZS5mbGFncyA9IDA7CisJcGFyYW1zLT51LmNvcmUucGFnZXNpemUgPSAwOworCXBhcmFtcy0+dS5jb3JlLnJvb3RkZXYgPSAwOworCisJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7Cit9CisKKworI2lmZGVmIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUworc3RhdGljIHZvaWQgc2V0dXBfbWVtb3J5X3RhZ3MgKGJkX3QgKmJkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IENPTkZJR19OUl9EUkFNX0JBTktTOyBpKyspIHsKKwkJcGFyYW1zLT5oZHIudGFnID0gQVRBR19NRU07CisJCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX21lbTMyKTsKKworCQlwYXJhbXMtPnUubWVtLnN0YXJ0ID0gYmQtPmJpX2RyYW1baV0uc3RhcnQ7CisJCXBhcmFtcy0+dS5tZW0uc2l6ZSA9IGJkLT5iaV9kcmFtW2ldLnNpemU7CisKKwkJcGFyYW1zID0gdGFnX25leHQgKHBhcmFtcyk7CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyAqLworCisKK3N0YXRpYyB2b2lkIHNldHVwX2NvbW1hbmRsaW5lX3RhZyAoYmRfdCAqYmQsIGNoYXIgKmNvbW1hbmRsaW5lKQoreworCWNoYXIgKnA7CisKKwlpZiAoIWNvbW1hbmRsaW5lKQorCQlyZXR1cm47CisKKwkvKiBlYXQgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworCWZvciAocCA9IGNvbW1hbmRsaW5lOyAqcCA9PSAnICc7IHArKyk7CisKKwkvKiBza2lwIG5vbi1leGlzdGVudCBjb21tYW5kIGxpbmVzIHNvIHRoZSBrZXJuZWwgd2lsbCBzdGlsbAorCSAqIHVzZSBpdHMgZGVmYXVsdCBjb21tYW5kIGxpbmUuCisJICovCisJaWYgKCpwID09ICdcMCcpCisJCXJldHVybjsKKworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfQ01ETElORTsKKwlwYXJhbXMtPmhkci5zaXplID0KKwkJKHNpemVvZiAoc3RydWN0IHRhZ19oZWFkZXIpICsgc3RybGVuIChwKSArIDEgKyA0KSA+PiAyOworCisJc3RyY3B5IChwYXJhbXMtPnUuY21kbGluZS5jbWRsaW5lLCBwKTsKKworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorCisKKyNpZmRlZiBDT05GSUdfSU5JVFJEX1RBRworc3RhdGljIHZvaWQgc2V0dXBfaW5pdHJkX3RhZyAoYmRfdCAqYmQsIHVsb25nIGluaXRyZF9zdGFydCwgdWxvbmcgaW5pdHJkX2VuZCkKK3sKKwkvKiBhbiBBVEFHX0lOSVRSRCBub2RlIHRlbGxzIHRoZSBrZXJuZWwgd2hlcmUgdGhlIGNvbXByZXNzZWQKKwkgKiByYW1kaXNrIGNhbiBiZSBmb3VuZC4gQVRBR19SRElNRyBpcyBhIGJldHRlciBuYW1lLCBhY3R1YWxseS4KKwkgKi8KKwlwYXJhbXMtPmhkci50YWcgPSBBVEFHX0lOSVRSRDI7CisJcGFyYW1zLT5oZHIuc2l6ZSA9IHRhZ19zaXplICh0YWdfaW5pdHJkKTsKKworCXBhcmFtcy0+dS5pbml0cmQuc3RhcnQgPSBpbml0cmRfc3RhcnQ7CisJcGFyYW1zLT51LmluaXRyZC5zaXplID0gaW5pdHJkX2VuZCAtIGluaXRyZF9zdGFydDsKKworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworfQorI2VuZGlmIC8qIENPTkZJR19JTklUUkRfVEFHICovCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX1RBRwordm9pZCBzZXR1cF9zZXJpYWxfdGFnIChzdHJ1Y3QgdGFnICoqdG1wKQoreworCXN0cnVjdCB0YWcgKnBhcmFtcyA9ICp0bXA7CisJc3RydWN0IHRhZ19zZXJpYWxuciBzZXJpYWxucjsKKwl2b2lkIGdldF9ib2FyZF9zZXJpYWwoc3RydWN0IHRhZ19zZXJpYWxuciAqc2VyaWFsbnIpOworCisJZ2V0X2JvYXJkX3NlcmlhbCgmc2VyaWFsbnIpOworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfU0VSSUFMOworCXBhcmFtcy0+aGRyLnNpemUgPSB0YWdfc2l6ZSAodGFnX3NlcmlhbG5yKTsKKwlwYXJhbXMtPnUuc2VyaWFsbnIubG93ID0gc2VyaWFsbnIubG93OworCXBhcmFtcy0+dS5zZXJpYWxuci5oaWdoPSBzZXJpYWxuci5oaWdoOworCXBhcmFtcyA9IHRhZ19uZXh0IChwYXJhbXMpOworCSp0bXAgPSBwYXJhbXM7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SRVZJU0lPTl9UQUcKK3ZvaWQgc2V0dXBfcmV2aXNpb25fdGFnKHN0cnVjdCB0YWcgKippbl9wYXJhbXMpCit7CisJdTMyIHJldiA9IDA7CisJdTMyIGdldF9ib2FyZF9yZXYodm9pZCk7CisKKwlyZXYgPSBnZXRfYm9hcmRfcmV2KCk7CisJcGFyYW1zLT5oZHIudGFnID0gQVRBR19SRVZJU0lPTjsKKwlwYXJhbXMtPmhkci5zaXplID0gdGFnX3NpemUgKHRhZ19yZXZpc2lvbik7CisJcGFyYW1zLT51LnJldmlzaW9uLnJldiA9IHJldjsKKwlwYXJhbXMgPSB0YWdfbmV4dCAocGFyYW1zKTsKK30KKyNlbmRpZiAgLyogQ09ORklHX1JFVklTSU9OX1RBRyAqLworCisKK3N0YXRpYyB2b2lkIHNldHVwX2VuZF90YWcgKGJkX3QgKmJkKQoreworCXBhcmFtcy0+aGRyLnRhZyA9IEFUQUdfTk9ORTsKKwlwYXJhbXMtPmhkci5zaXplID0gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19TRVRVUF9NRU1PUllfVEFHUyB8fCBDT05GSUdfQ01ETElORV9UQUcgfHwgQ09ORklHX0lOSVRSRF9UQUcgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9jcmMzMi5jIGIveC1sb2FkZXIvbGliL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NDk0YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL2xpYi9jcmMzMi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBjcmMzMi5jIGZyb20gdGhlIHpsaWItMS4xLjMgZGlzdHJpYnV0aW9uCisgKiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyLgorICovCisKKy8qIGNyYzMyLmMgLS0gY29tcHV0ZSB0aGUgQ1JDLTMyIG9mIGEgZGF0YSBzdHJlYW0KKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisjaWZuZGVmIFVTRV9IT1NUQ0MKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGNvbXBpbGVyLmg+CisjaW5jbHVkZSA8eC1sb2FkL2NyYy5oPgorCisjaW5jbHVkZSAieC1sb2FkL3psaWIuaCIKKworI2RlZmluZSBsb2NhbCBzdGF0aWMKKyNkZWZpbmUgWkVYUE9SVAkvKiBlbXB0eSAqLworCisjZGVmaW5lIHRvbGUoeCkgY3B1X3RvX2xlMzIoeCkKKworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisKK2xvY2FsIGludCBjcmNfdGFibGVfZW1wdHkgPSAxOworbG9jYWwgdWludDMyX3QgY3JjX3RhYmxlWzI1Nl07Citsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlIE9GKCh2b2lkKSk7CisKKy8qCisgIEdlbmVyYXRlIGEgdGFibGUgZm9yIGEgYnl0ZS13aXNlIDMyLWJpdCBDUkMgY2FsY3VsYXRpb24gb24gdGhlIHBvbHlub21pYWw6CisgIHheMzIreF4yNit4XjIzK3heMjIreF4xNit4XjEyK3heMTEreF4xMCt4XjgreF43K3heNSt4XjQreF4yK3grMS4KKworICBQb2x5bm9taWFscyBvdmVyIEdGKDIpIGFyZSByZXByZXNlbnRlZCBpbiBiaW5hcnksIG9uZSBiaXQgcGVyIGNvZWZmaWNpZW50LAorICB3aXRoIHRoZSBsb3dlc3QgcG93ZXJzIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gIFRoZW4gYWRkaW5nIHBvbHlub21pYWxzCisgIGlzIGp1c3QgZXhjbHVzaXZlLW9yLCBhbmQgbXVsdGlwbHlpbmcgYSBwb2x5bm9taWFsIGJ5IHggaXMgYSByaWdodCBzaGlmdCBieQorICBvbmUuICBJZiB3ZSBjYWxsIHRoZSBhYm92ZSBwb2x5bm9taWFsIHAsIGFuZCByZXByZXNlbnQgYSBieXRlIGFzIHRoZQorICBwb2x5bm9taWFsIHEsIGFsc28gd2l0aCB0aGUgbG93ZXN0IHBvd2VyIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCAoc28gdGhlCisgIGJ5dGUgMHhiMSBpcyB0aGUgcG9seW5vbWlhbCB4XjcreF4zK3grMSksIHRoZW4gdGhlIENSQyBpcyAocSp4XjMyKSBtb2QgcCwKKyAgd2hlcmUgYSBtb2QgYiBtZWFucyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlkaW5nIGEgYnkgYi4KKworICBUaGlzIGNhbGN1bGF0aW9uIGlzIGRvbmUgdXNpbmcgdGhlIHNoaWZ0LXJlZ2lzdGVyIG1ldGhvZCBvZiBtdWx0aXBseWluZyBhbmQKKyAgdGFraW5nIHRoZSByZW1haW5kZXIuICBUaGUgcmVnaXN0ZXIgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgYW5kIGZvciBlYWNoCisgIGluY29taW5nIGJpdCwgeF4zMiBpcyBhZGRlZCBtb2QgcCB0byB0aGUgcmVnaXN0ZXIgaWYgdGhlIGJpdCBpcyBhIG9uZSAod2hlcmUKKyAgeF4zMiBtb2QgcCBpcyBwK3heMzIgPSB4XjI2Ky4uLisxKSwgYW5kIHRoZSByZWdpc3RlciBpcyBtdWx0aXBsaWVkIG1vZCBwIGJ5CisgIHggKHdoaWNoIGlzIHNoaWZ0aW5nIHJpZ2h0IGJ5IG9uZSBhbmQgYWRkaW5nIHheMzIgbW9kIHAgaWYgdGhlIGJpdCBzaGlmdGVkCisgIG91dCBpcyBhIG9uZSkuICBXZSBzdGFydCB3aXRoIHRoZSBoaWdoZXN0IHBvd2VyIChsZWFzdCBzaWduaWZpY2FudCBiaXQpIG9mCisgIHEgYW5kIHJlcGVhdCBmb3IgYWxsIGVpZ2h0IGJpdHMgb2YgcS4KKworICBUaGUgdGFibGUgaXMgc2ltcGx5IHRoZSBDUkMgb2YgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMuICBUaGlzIGlzIGFsbAorICB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGdlbmVyYXRlIENSQydzIG9uIGRhdGEgYSBieXRlIGF0IGEgdGltZSBmb3IgYWxsCisgIGNvbWJpbmF0aW9ucyBvZiBDUkMgcmVnaXN0ZXIgdmFsdWVzIGFuZCBpbmNvbWluZyBieXRlcy4KKyovCitsb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKK3sKKyAgdWludDMyX3QgYzsKKyAgaW50IG4sIGs7CisgIHVMb25nIHBvbHk7CQkvKiBwb2x5bm9taWFsIGV4Y2x1c2l2ZS1vciBwYXR0ZXJuICovCisgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KKyAgc3RhdGljIGNvbnN0IEJ5dGUgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworCisgIC8qIG1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICgweGVkYjg4MzIwTCkgKi8KKyAgcG9seSA9IDBMOworICBmb3IgKG4gPSAwOyBuIDwgc2l6ZW9mKHApL3NpemVvZihCeXRlKTsgbisrKQorICAgIHBvbHkgfD0gMUwgPDwgKDMxIC0gcFtuXSk7CisKKyAgZm9yIChuID0gMDsgbiA8IDI1NjsgbisrKQorICB7CisgICAgYyA9ICh1TG9uZyluOworICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7CisgICAgY3JjX3RhYmxlW25dID0gdG9sZShjKTsKKyAgfQorICBjcmNfdGFibGVfZW1wdHkgPSAwOworfQorI2Vsc2UKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGFibGUgb2YgQ1JDLTMyJ3Mgb2YgYWxsIHNpbmdsZS1ieXRlIHZhbHVlcyAobWFkZSBieSBtYWtlX2NyY190YWJsZSkKKyAqLworCitsb2NhbCBjb25zdCB1aW50MzJfdCBjcmNfdGFibGVbMjU2XSA9IHsKK3RvbGUoMHgwMDAwMDAwMEwpLCB0b2xlKDB4NzcwNzMwOTZMKSwgdG9sZSgweGVlMGU2MTJjTCksIHRvbGUoMHg5OTA5NTFiYUwpLAordG9sZSgweDA3NmRjNDE5TCksIHRvbGUoMHg3MDZhZjQ4ZkwpLCB0b2xlKDB4ZTk2M2E1MzVMKSwgdG9sZSgweDllNjQ5NWEzTCksCit0b2xlKDB4MGVkYjg4MzJMKSwgdG9sZSgweDc5ZGNiOGE0TCksIHRvbGUoMHhlMGQ1ZTkxZUwpLCB0b2xlKDB4OTdkMmQ5ODhMKSwKK3RvbGUoMHgwOWI2NGMyYkwpLCB0b2xlKDB4N2ViMTdjYmRMKSwgdG9sZSgweGU3YjgyZDA3TCksIHRvbGUoMHg5MGJmMWQ5MUwpLAordG9sZSgweDFkYjcxMDY0TCksIHRvbGUoMHg2YWIwMjBmMkwpLCB0b2xlKDB4ZjNiOTcxNDhMKSwgdG9sZSgweDg0YmU0MWRlTCksCit0b2xlKDB4MWFkYWQ0N2RMKSwgdG9sZSgweDZkZGRlNGViTCksIHRvbGUoMHhmNGQ0YjU1MUwpLCB0b2xlKDB4ODNkMzg1YzdMKSwKK3RvbGUoMHgxMzZjOTg1NkwpLCB0b2xlKDB4NjQ2YmE4YzBMKSwgdG9sZSgweGZkNjJmOTdhTCksIHRvbGUoMHg4YTY1YzllY0wpLAordG9sZSgweDE0MDE1YzRmTCksIHRvbGUoMHg2MzA2NmNkOUwpLCB0b2xlKDB4ZmEwZjNkNjNMKSwgdG9sZSgweDhkMDgwZGY1TCksCit0b2xlKDB4M2I2ZTIwYzhMKSwgdG9sZSgweDRjNjkxMDVlTCksIHRvbGUoMHhkNTYwNDFlNEwpLCB0b2xlKDB4YTI2NzcxNzJMKSwKK3RvbGUoMHgzYzAzZTRkMUwpLCB0b2xlKDB4NGIwNGQ0NDdMKSwgdG9sZSgweGQyMGQ4NWZkTCksIHRvbGUoMHhhNTBhYjU2YkwpLAordG9sZSgweDM1YjVhOGZhTCksIHRvbGUoMHg0MmIyOTg2Y0wpLCB0b2xlKDB4ZGJiYmM5ZDZMKSwgdG9sZSgweGFjYmNmOTQwTCksCit0b2xlKDB4MzJkODZjZTNMKSwgdG9sZSgweDQ1ZGY1Yzc1TCksIHRvbGUoMHhkY2Q2MGRjZkwpLCB0b2xlKDB4YWJkMTNkNTlMKSwKK3RvbGUoMHgyNmQ5MzBhY0wpLCB0b2xlKDB4NTFkZTAwM2FMKSwgdG9sZSgweGM4ZDc1MTgwTCksIHRvbGUoMHhiZmQwNjExNkwpLAordG9sZSgweDIxYjRmNGI1TCksIHRvbGUoMHg1NmIzYzQyM0wpLCB0b2xlKDB4Y2ZiYTk1OTlMKSwgdG9sZSgweGI4YmRhNTBmTCksCit0b2xlKDB4MjgwMmI4OWVMKSwgdG9sZSgweDVmMDU4ODA4TCksIHRvbGUoMHhjNjBjZDliMkwpLCB0b2xlKDB4YjEwYmU5MjRMKSwKK3RvbGUoMHgyZjZmN2M4N0wpLCB0b2xlKDB4NTg2ODRjMTFMKSwgdG9sZSgweGMxNjExZGFiTCksIHRvbGUoMHhiNjY2MmQzZEwpLAordG9sZSgweDc2ZGM0MTkwTCksIHRvbGUoMHgwMWRiNzEwNkwpLCB0b2xlKDB4OThkMjIwYmNMKSwgdG9sZSgweGVmZDUxMDJhTCksCit0b2xlKDB4NzFiMTg1ODlMKSwgdG9sZSgweDA2YjZiNTFmTCksIHRvbGUoMHg5ZmJmZTRhNUwpLCB0b2xlKDB4ZThiOGQ0MzNMKSwKK3RvbGUoMHg3ODA3YzlhMkwpLCB0b2xlKDB4MGYwMGY5MzRMKSwgdG9sZSgweDk2MDlhODhlTCksIHRvbGUoMHhlMTBlOTgxOEwpLAordG9sZSgweDdmNmEwZGJiTCksIHRvbGUoMHgwODZkM2QyZEwpLCB0b2xlKDB4OTE2NDZjOTdMKSwgdG9sZSgweGU2NjM1YzAxTCksCit0b2xlKDB4NmI2YjUxZjRMKSwgdG9sZSgweDFjNmM2MTYyTCksIHRvbGUoMHg4NTY1MzBkOEwpLCB0b2xlKDB4ZjI2MjAwNGVMKSwKK3RvbGUoMHg2YzA2OTVlZEwpLCB0b2xlKDB4MWIwMWE1N2JMKSwgdG9sZSgweDgyMDhmNGMxTCksIHRvbGUoMHhmNTBmYzQ1N0wpLAordG9sZSgweDY1YjBkOWM2TCksIHRvbGUoMHgxMmI3ZTk1MEwpLCB0b2xlKDB4OGJiZWI4ZWFMKSwgdG9sZSgweGZjYjk4ODdjTCksCit0b2xlKDB4NjJkZDFkZGZMKSwgdG9sZSgweDE1ZGEyZDQ5TCksIHRvbGUoMHg4Y2QzN2NmM0wpLCB0b2xlKDB4ZmJkNDRjNjVMKSwKK3RvbGUoMHg0ZGIyNjE1OEwpLCB0b2xlKDB4M2FiNTUxY2VMKSwgdG9sZSgweGEzYmMwMDc0TCksIHRvbGUoMHhkNGJiMzBlMkwpLAordG9sZSgweDRhZGZhNTQxTCksIHRvbGUoMHgzZGQ4OTVkN0wpLCB0b2xlKDB4YTRkMWM0NmRMKSwgdG9sZSgweGQzZDZmNGZiTCksCit0b2xlKDB4NDM2OWU5NmFMKSwgdG9sZSgweDM0NmVkOWZjTCksIHRvbGUoMHhhZDY3ODg0NkwpLCB0b2xlKDB4ZGE2MGI4ZDBMKSwKK3RvbGUoMHg0NDA0MmQ3M0wpLCB0b2xlKDB4MzMwMzFkZTVMKSwgdG9sZSgweGFhMGE0YzVmTCksIHRvbGUoMHhkZDBkN2NjOUwpLAordG9sZSgweDUwMDU3MTNjTCksIHRvbGUoMHgyNzAyNDFhYUwpLCB0b2xlKDB4YmUwYjEwMTBMKSwgdG9sZSgweGM5MGMyMDg2TCksCit0b2xlKDB4NTc2OGI1MjVMKSwgdG9sZSgweDIwNmY4NWIzTCksIHRvbGUoMHhiOTY2ZDQwOUwpLCB0b2xlKDB4Y2U2MWU0OWZMKSwKK3RvbGUoMHg1ZWRlZjkwZUwpLCB0b2xlKDB4MjlkOWM5OThMKSwgdG9sZSgweGIwZDA5ODIyTCksIHRvbGUoMHhjN2Q3YThiNEwpLAordG9sZSgweDU5YjMzZDE3TCksIHRvbGUoMHgyZWI0MGQ4MUwpLCB0b2xlKDB4YjdiZDVjM2JMKSwgdG9sZSgweGMwYmE2Y2FkTCksCit0b2xlKDB4ZWRiODgzMjBMKSwgdG9sZSgweDlhYmZiM2I2TCksIHRvbGUoMHgwM2I2ZTIwY0wpLCB0b2xlKDB4NzRiMWQyOWFMKSwKK3RvbGUoMHhlYWQ1NDczOUwpLCB0b2xlKDB4OWRkMjc3YWZMKSwgdG9sZSgweDA0ZGIyNjE1TCksIHRvbGUoMHg3M2RjMTY4M0wpLAordG9sZSgweGUzNjMwYjEyTCksIHRvbGUoMHg5NDY0M2I4NEwpLCB0b2xlKDB4MGQ2ZDZhM2VMKSwgdG9sZSgweDdhNmE1YWE4TCksCit0b2xlKDB4ZTQwZWNmMGJMKSwgdG9sZSgweDkzMDlmZjlkTCksIHRvbGUoMHgwYTAwYWUyN0wpLCB0b2xlKDB4N2QwNzllYjFMKSwKK3RvbGUoMHhmMDBmOTM0NEwpLCB0b2xlKDB4ODcwOGEzZDJMKSwgdG9sZSgweDFlMDFmMjY4TCksIHRvbGUoMHg2OTA2YzJmZUwpLAordG9sZSgweGY3NjI1NzVkTCksIHRvbGUoMHg4MDY1NjdjYkwpLCB0b2xlKDB4MTk2YzM2NzFMKSwgdG9sZSgweDZlNmIwNmU3TCksCit0b2xlKDB4ZmVkNDFiNzZMKSwgdG9sZSgweDg5ZDMyYmUwTCksIHRvbGUoMHgxMGRhN2E1YUwpLCB0b2xlKDB4NjdkZDRhY2NMKSwKK3RvbGUoMHhmOWI5ZGY2ZkwpLCB0b2xlKDB4OGViZWVmZjlMKSwgdG9sZSgweDE3YjdiZTQzTCksIHRvbGUoMHg2MGIwOGVkNUwpLAordG9sZSgweGQ2ZDZhM2U4TCksIHRvbGUoMHhhMWQxOTM3ZUwpLCB0b2xlKDB4MzhkOGMyYzRMKSwgdG9sZSgweDRmZGZmMjUyTCksCit0b2xlKDB4ZDFiYjY3ZjFMKSwgdG9sZSgweGE2YmM1NzY3TCksIHRvbGUoMHgzZmI1MDZkZEwpLCB0b2xlKDB4NDhiMjM2NGJMKSwKK3RvbGUoMHhkODBkMmJkYUwpLCB0b2xlKDB4YWYwYTFiNGNMKSwgdG9sZSgweDM2MDM0YWY2TCksIHRvbGUoMHg0MTA0N2E2MEwpLAordG9sZSgweGRmNjBlZmMzTCksIHRvbGUoMHhhODY3ZGY1NUwpLCB0b2xlKDB4MzE2ZThlZWZMKSwgdG9sZSgweDQ2NjliZTc5TCksCit0b2xlKDB4Y2I2MWIzOGNMKSwgdG9sZSgweGJjNjY4MzFhTCksIHRvbGUoMHgyNTZmZDJhMEwpLCB0b2xlKDB4NTI2OGUyMzZMKSwKK3RvbGUoMHhjYzBjNzc5NUwpLCB0b2xlKDB4YmIwYjQ3MDNMKSwgdG9sZSgweDIyMDIxNmI5TCksIHRvbGUoMHg1NTA1MjYyZkwpLAordG9sZSgweGM1YmEzYmJlTCksIHRvbGUoMHhiMmJkMGIyOEwpLCB0b2xlKDB4MmJiNDVhOTJMKSwgdG9sZSgweDVjYjM2YTA0TCksCit0b2xlKDB4YzJkN2ZmYTdMKSwgdG9sZSgweGI1ZDBjZjMxTCksIHRvbGUoMHgyY2Q5OWU4YkwpLCB0b2xlKDB4NWJkZWFlMWRMKSwKK3RvbGUoMHg5YjY0YzJiMEwpLCB0b2xlKDB4ZWM2M2YyMjZMKSwgdG9sZSgweDc1NmFhMzljTCksIHRvbGUoMHgwMjZkOTMwYUwpLAordG9sZSgweDljMDkwNmE5TCksIHRvbGUoMHhlYjBlMzYzZkwpLCB0b2xlKDB4NzIwNzY3ODVMKSwgdG9sZSgweDA1MDA1NzEzTCksCit0b2xlKDB4OTViZjRhODJMKSwgdG9sZSgweGUyYjg3YTE0TCksIHRvbGUoMHg3YmIxMmJhZUwpLCB0b2xlKDB4MGNiNjFiMzhMKSwKK3RvbGUoMHg5MmQyOGU5YkwpLCB0b2xlKDB4ZTVkNWJlMGRMKSwgdG9sZSgweDdjZGNlZmI3TCksIHRvbGUoMHgwYmRiZGYyMUwpLAordG9sZSgweDg2ZDNkMmQ0TCksIHRvbGUoMHhmMWQ0ZTI0MkwpLCB0b2xlKDB4NjhkZGIzZjhMKSwgdG9sZSgweDFmZGE4MzZlTCksCit0b2xlKDB4ODFiZTE2Y2RMKSwgdG9sZSgweGY2YjkyNjViTCksIHRvbGUoMHg2ZmIwNzdlMUwpLCB0b2xlKDB4MThiNzQ3NzdMKSwKK3RvbGUoMHg4ODA4NWFlNkwpLCB0b2xlKDB4ZmYwZjZhNzBMKSwgdG9sZSgweDY2MDYzYmNhTCksIHRvbGUoMHgxMTAxMGI1Y0wpLAordG9sZSgweDhmNjU5ZWZmTCksIHRvbGUoMHhmODYyYWU2OUwpLCB0b2xlKDB4NjE2YmZmZDNMKSwgdG9sZSgweDE2NmNjZjQ1TCksCit0b2xlKDB4YTAwYWUyNzhMKSwgdG9sZSgweGQ3MGRkMmVlTCksIHRvbGUoMHg0ZTA0ODM1NEwpLCB0b2xlKDB4MzkwM2IzYzJMKSwKK3RvbGUoMHhhNzY3MjY2MUwpLCB0b2xlKDB4ZDA2MDE2ZjdMKSwgdG9sZSgweDQ5Njk0NzRkTCksIHRvbGUoMHgzZTZlNzdkYkwpLAordG9sZSgweGFlZDE2YTRhTCksIHRvbGUoMHhkOWQ2NWFkY0wpLCB0b2xlKDB4NDBkZjBiNjZMKSwgdG9sZSgweDM3ZDgzYmYwTCksCit0b2xlKDB4YTliY2FlNTNMKSwgdG9sZSgweGRlYmI5ZWM1TCksIHRvbGUoMHg0N2IyY2Y3ZkwpLCB0b2xlKDB4MzBiNWZmZTlMKSwKK3RvbGUoMHhiZGJkZjIxY0wpLCB0b2xlKDB4Y2FiYWMyOGFMKSwgdG9sZSgweDUzYjM5MzMwTCksIHRvbGUoMHgyNGI0YTNhNkwpLAordG9sZSgweGJhZDAzNjA1TCksIHRvbGUoMHhjZGQ3MDY5M0wpLCB0b2xlKDB4NTRkZTU3MjlMKSwgdG9sZSgweDIzZDk2N2JmTCksCit0b2xlKDB4YjM2NjdhMmVMKSwgdG9sZSgweGM0NjE0YWI4TCksIHRvbGUoMHg1ZDY4MWIwMkwpLCB0b2xlKDB4MmE2ZjJiOTRMKSwKK3RvbGUoMHhiNDBiYmUzN0wpLCB0b2xlKDB4YzMwYzhlYTFMKSwgdG9sZSgweDVhMDVkZjFiTCksIHRvbGUoMHgyZDAyZWY4ZEwpCit9OworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyMgaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorIyAgZGVmaW5lIERPX0NSQyh4KSBjcmMgPSB0YWJbKGNyYyBeICh4KSkgJiAyNTVdIF4gKGNyYyA+PiA4KQorIyBlbHNlCisjICBkZWZpbmUgRE9fQ1JDKHgpIGNyYyA9IHRhYlsoKGNyYyA+PiAyNCkgXiAoeCkpICYgMjU1XSBeIChjcmMgPDwgOCkKKyMgZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBObyBvbmVzIGNvbXBsZW1lbnQgdmVyc2lvbi4gSkZGUzIgKGFuZCBvdGhlciB0aGluZ3MgPykKKyAqIGRvbid0IHVzZSBvbmVzIGNvbXBsaW1lbnQgaW4gdGhlaXIgQ1JDIGNhbGN1bGF0aW9ucy4KKyAqLwordWludDMyX3QgWkVYUE9SVCBjcmMzMl9ub19jb21wKHVpbnQzMl90IGNyYywgY29uc3QgQnl0ZWYgKmJ1ZiwgdUludCBsZW4pCit7CisgICAgY29uc3QgdWludDMyX3QgKnRhYiA9IGNyY190YWJsZTsKKyAgICBjb25zdCB1aW50MzJfdCAqYiA9KGNvbnN0IHVpbnQzMl90ICopYnVmOworICAgIHNpemVfdCByZW1fbGVuOworI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCisgICAgaWYgKGNyY190YWJsZV9lbXB0eSkKKyAgICAgIG1ha2VfY3JjX3RhYmxlKCk7CisjZW5kaWYKKyAgICBjcmMgPSBjcHVfdG9fbGUzMihjcmMpOworICAgIC8qIEFsaWduIGl0ICovCisgICAgaWYgKCgobG9uZyliKSAmIDMgJiYgbGVuKSB7CisJIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKWI7CisJIGRvIHsKKwkgICAgICBET19DUkMoKnArKyk7CisJIH0gd2hpbGUgKCgtLWxlbikgJiYgKChsb25nKXApJjMpOworCSBiID0gKHVpbnQzMl90ICopcDsKKyAgICB9CisKKyAgICByZW1fbGVuID0gbGVuICYgMzsKKyAgICBsZW4gPSBsZW4gPj4gMjsKKyAgICBmb3IgKC0tYjsgbGVuOyAtLWxlbikgeworCSAvKiBsb2FkIGRhdGEgMzIgYml0cyB3aWRlLCB4b3IgZGF0YSAzMiBiaXRzIHdpZGUuICovCisJIGNyYyBePSAqKytiOyAvKiB1c2UgcHJlIGluY3JlbWVudCBmb3Igc3BlZWQgKi8KKwkgRE9fQ1JDKDApOworCSBET19DUkMoMCk7CisJIERPX0NSQygwKTsKKwkgRE9fQ1JDKDApOworICAgIH0KKyAgICBsZW4gPSByZW1fbGVuOworICAgIC8qIEFuZCB0aGUgbGFzdCBmZXcgYnl0ZXMgKi8KKyAgICBpZiAobGVuKSB7CisJIHVpbnQ4X3QgKnAgPSAodWludDhfdCAqKShiICsgMSkgLSAxOworCSBkbyB7CisJICAgICAgRE9fQ1JDKCorK3ApOyAvKiB1c2UgcHJlIGluY3JlbWVudCBmb3Igc3BlZWQgKi8KKwkgfSB3aGlsZSAoLS1sZW4pOworICAgIH0KKworICAgIHJldHVybiBsZTMyX3RvX2NwdShjcmMpOworfQorI3VuZGVmIERPX0NSQworCit1aW50MzJfdCBaRVhQT1JUIGNyYzMyICh1aW50MzJfdCBjcmMsIGNvbnN0IEJ5dGVmICpwLCB1SW50IGxlbikKK3sKKyAgICAgcmV0dXJuIGNyYzMyX25vX2NvbXAoY3JjIF4gMHhmZmZmZmZmZkwsIHAsIGxlbikgXiAweGZmZmZmZmZmTDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgY3JjMzIgY2hlY2tzdW0gdHJpZ2dlcmluZyB0aGUgd2F0Y2hkb2cgZXZlcnkgJ2NodW5rX3N6JyBieXRlcworICogb2YgaW5wdXQuCisgKi8KK3VpbnQzMl90IFpFWFBPUlQgY3JjMzJfd2QgKHVpbnQzMl90IGNyYywKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgIHVJbnQgbGVuLCB1SW50IGNodW5rX3N6KQoreworI2lmIGRlZmluZWQoQ09ORklHX0hXX1dBVENIRE9HKSB8fCBkZWZpbmVkKENPTkZJR19XQVRDSERPRykKKwljb25zdCB1bnNpZ25lZCBjaGFyICplbmQsICpjdXJyOworCWludCBjaHVuazsKKworCWN1cnIgPSBidWY7CisJZW5kID0gYnVmICsgbGVuOworCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCWNodW5rID0gZW5kIC0gY3VycjsKKwkJaWYgKGNodW5rID4gY2h1bmtfc3opCisJCQljaHVuayA9IGNodW5rX3N6OworCQljcmMgPSBjcmMzMiAoY3JjLCBjdXJyLCBjaHVuayk7CisJCWN1cnIgKz0gY2h1bms7CisJCVdBVENIRE9HX1JFU0VUICgpOworCX0KKyNlbHNlCisJY3JjID0gY3JjMzIgKGNyYywgYnVmLCBsZW4pOworI2VuZGlmCisKKwlyZXR1cm4gY3JjOworfQpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL2N0eXBlLmMgYi94LWxvYWRlci9saWIvY3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQwNDY4Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2N0eXBlLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMAorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogIGxpbnV4L2xpYi9jdHlwZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKwordW5zaWduZWQgY2hhciBfY3R5cGVbXSA9IHsKK19DLF9DLF9DLF9DLF9DLF9DLF9DLF9DLAkJCS8qIDAtNyAqLworX0MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0MsX0MsCQkvKiA4LTE1ICovCitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkvKiAxNi0yMyAqLworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJLyogMjQtMzEgKi8KK19TfF9TUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiAzMi0zOSAqLworX1AsX1AsX1AsX1AsX1AsX1AsX1AsX1AsCQkJLyogNDAtNDcgKi8KK19ELF9ELF9ELF9ELF9ELF9ELF9ELF9ELAkJCS8qIDQ4LTU1ICovCitfRCxfRCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkvKiA1Ni02MyAqLworX1AsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1V8X1gsX1UsCS8qIDY0LTcxICovCitfVSxfVSxfVSxfVSxfVSxfVSxfVSxfVSwJCQkvKiA3Mi03OSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsCQkJLyogODAtODcgKi8KK19VLF9VLF9VLF9QLF9QLF9QLF9QLF9QLAkJCS8qIDg4LTk1ICovCitfUCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTHxfWCxfTCwJLyogOTYtMTAzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJCQkvKiAxMDQtMTExICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJCQkvKiAxMTItMTE5ICovCitfTCxfTCxfTCxfUCxfUCxfUCxfUCxfQywJCQkvKiAxMjAtMTI3ICovCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAkJLyogMTI4LTE0MyAqLworMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwJCS8qIDE0NC0xNTkgKi8KK19TfF9TUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwgICAvKiAxNjAtMTc1ICovCitfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwgICAgICAgLyogMTc2LTE5MSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsICAgICAgIC8qIDE5Mi0yMDcgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9QLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9MLCAgICAgICAvKiAyMDgtMjIzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwgICAgICAgLyogMjI0LTIzOSAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX1AsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0x9OyAgICAgIC8qIDI0MC0yNTUgKi8KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9kaXNwbGF5X29wdGlvbnMuYyBiL3gtbG9hZGVyL2xpYi9kaXNwbGF5X29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ3NGJhCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2Rpc3BsYXlfb3B0aW9ucy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwLTIwMDIKKyAqIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CitpbnQgZGlzcGxheV9vcHRpb25zICh2b2lkKQoreworCWV4dGVybiBjaGFyIHZlcnNpb25fc3RyaW5nW107CisKKyNpZiBkZWZpbmVkKEJVSUxEX1RBRykKKwlwcmludGYgKCJcblxuJXMsIEJ1aWxkOiAlc1xuXG4iLCB2ZXJzaW9uX3N0cmluZywgQlVJTERfVEFHKTsKKyNlbHNlCisJcHJpbnRmICgiXG5cbiVzXG5cbiIsIHZlcnNpb25fc3RyaW5nKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogcHJpbnQgc2l6ZXMgYXMgInh4eCBLaUIiLCAieHh4LnkgS2lCIiwgInh4eCBNaUIiLCAieHh4LnkgTWlCIiwKKyAqIHh4eCBHaUIsIHh4eC55IEdpQiwgZXRjIGFzIG5lZWRlZDsgYWxsb3cgZm9yIG9wdGlvbmFsIHRyYWlsaW5nIHN0cmluZworICogKGxpa2UgIlxuIikKKyAqLwordm9pZCBwcmludF9zaXplKHVuc2lnbmVkIGxvbmcgbG9uZyBzaXplLCBjb25zdCBjaGFyICpzKQoreworCXVuc2lnbmVkIGxvbmcgbSA9IDAsIG47CisJdW5zaWduZWQgbG9uZyBsb25nIGY7CisJc3RhdGljIGNvbnN0IGNoYXIgbmFtZXNbXSA9IHsnRScsICdQJywgJ1QnLCAnRycsICdNJywgJ0snfTsKKwl1bnNpZ25lZCBsb25nIGQgPSAxMCAqIEFSUkFZX1NJWkUobmFtZXMpOworCWNoYXIgYyA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYW1lcyk7IGkrKywgZCAtPSAxMCkgeworCQlpZiAoc2l6ZSA+PiBkKSB7CisJCQljID0gbmFtZXNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYykgeworCQlwcmludGYoIiVsbHUgQnl0ZXMlcyIsIHNpemUsIHMpOworCQlyZXR1cm47CisJfQorCisJbiA9IHNpemUgPj4gZDsKKwlmID0gc2l6ZSAmICgoMVVMTCA8PCBkKSAtIDEpOworCisJLyogSWYgdGhlcmUncyBhIHJlbWFpbmRlciwgZGVhbCB3aXRoIGl0ICovCisJaWYgKGYpIHsKKwkJbSA9ICgxMFVMTCAqIGYgKyAoMVVMTCA8PCAoZCAtIDEpKSkgPj4gZDsKKworCQlpZiAobSA+PSAxMCkgeworCQkJbSAtPSAxMDsKKwkJCW4gKz0gMTsKKwkJfQorCX0KKworCXByaW50ZiAoIiVsdSIsIG4pOworCWlmIChtKSB7CisJCXByaW50ZiAoIi4lbGQiLCBtKTsKKwl9CisJcHJpbnRmICgiICVjaUIlcyIsIGMsIHMpOworfQorCisvKgorICogUHJpbnQgZGF0YSBidWZmZXIgaW4gaGV4IGFuZCBhc2NpaSBmb3JtIHRvIHRoZSB0ZXJtaW5hbC4KKyAqCisgKiBkYXRhIHJlYWRzIGFyZSBidWZmZXJlZCBzbyB0aGF0IGVhY2ggbWVtb3J5IGFkZHJlc3MgaXMgb25seSByZWFkIG9uY2UuCisgKiBVc2VmdWwgd2hlbiBkaXNwbGF5aW5nIHRoZSBjb250ZW50cyBvZiB2b2xhdGlsZSByZWdpc3RlcnMuCisgKgorICogcGFyYW1ldGVyczoKKyAqICAgIGFkZHI6IFN0YXJ0aW5nIGFkZHJlc3MgdG8gZGlzcGxheSBhdCBzdGFydCBvZiBsaW5lCisgKiAgICBkYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyCisgKiAgICB3aWR0aDogZGF0YSB2YWx1ZSB3aWR0aC4gIE1heSBiZSAxLCAyLCBvciA0LgorICogICAgY291bnQ6IG51bWJlciBvZiB2YWx1ZXMgdG8gZGlzcGxheQorICogICAgbGluZWxlbjogTnVtYmVyIG9mIHZhbHVlcyB0byBwcmludCBwZXIgbGluZTsgc3BlY2lmeSAwIGZvciBkZWZhdWx0IGxlbmd0aAorICovCisjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSF9CWVRFUyAoNjQpCisjZGVmaW5lIERFRkFVTFRfTElORV9MRU5HVEhfQllURVMgKDE2KQoraW50IHByaW50X2J1ZmZlciAodWxvbmcgYWRkciwgdm9pZCogZGF0YSwgdWludCB3aWR0aCwgdWludCBjb3VudCwgdWludCBsaW5lbGVuKQoreworCS8qIGxpbmVidWYgYXMgYSB1bmlvbiBjYXVzZXMgcHJvcGVyIGFsaWdubWVudCAqLworCXVuaW9uIGxpbmVidWYgeworCQl1aW50MzJfdCB1aVtNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQzMl90KSArIDFdOworCQl1aW50MTZfdCB1c1tNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQxNl90KSArIDFdOworCQl1aW50OF90ICB1Y1tNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKHVpbnQ4X3QpICsgMV07CisJfSBsYjsKKwlpbnQgaTsKKworCWlmIChsaW5lbGVuKndpZHRoID4gTUFYX0xJTkVfTEVOR1RIX0JZVEVTKQorCQlsaW5lbGVuID0gTUFYX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisJaWYgKGxpbmVsZW4gPCAxKQorCQlsaW5lbGVuID0gREVGQVVMVF9MSU5FX0xFTkdUSF9CWVRFUyAvIHdpZHRoOworCisJd2hpbGUgKGNvdW50KSB7CisJCXByaW50ZigiJTA4bHg6IiwgYWRkcik7CisKKwkJLyogY2hlY2sgZm9yIG92ZXJmbG93IGNvbmRpdGlvbiAqLworCQlpZiAoY291bnQgPCBsaW5lbGVuKQorCQkJbGluZWxlbiA9IGNvdW50OworCisJCS8qIENvcHkgZnJvbSBtZW1vcnkgaW50byBsaW5lYnVmIGFuZCBwcmludCBoZXggdmFsdWVzICovCisJCWZvciAoaSA9IDA7IGkgPCBsaW5lbGVuOyBpKyspIHsKKwkJCXVpbnQzMl90IHg7CisJCQlpZiAod2lkdGggPT0gNCkKKwkJCQl4ID0gbGIudWlbaV0gPSAqKHZvbGF0aWxlIHVpbnQzMl90ICopZGF0YTsKKwkJCWVsc2UgaWYgKHdpZHRoID09IDIpCisJCQkJeCA9IGxiLnVzW2ldID0gKih2b2xhdGlsZSB1aW50MTZfdCAqKWRhdGE7CisJCQllbHNlCisJCQkJeCA9IGxiLnVjW2ldID0gKih2b2xhdGlsZSB1aW50OF90ICopZGF0YTsKKwkJCXByaW50ZigiICUwKngiLCB3aWR0aCAqIDIsIHgpOworCQkJZGF0YSArPSB3aWR0aDsKKwkJfQorCisJCS8qIFByaW50IGRhdGEgaW4gQVNDSUkgY2hhcmFjdGVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGluZWxlbiAqIHdpZHRoOyBpKyspIHsKKwkJCWlmICghaXNwcmludChsYi51Y1tpXSkgfHwgbGIudWNbaV0gPj0gMHg4MCkKKwkJCQlsYi51Y1tpXSA9ICcuJzsKKwkJfQorCQlsYi51Y1tpXSA9ICdcMCc7CisJCXByaW50ZigiICAgICVzXG4iLCBsYi51Yyk7CisKKwkJLyogdXBkYXRlIHJlZmVyZW5jZXMgKi8KKwkJYWRkciArPSBsaW5lbGVuICogd2lkdGg7CisJCWNvdW50IC09IGxpbmVsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94LWxvYWRlci9saWIvZGl2MC5jIGIveC1sb2FkZXIvbGliL2RpdjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjY3YmYxCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2RpdjAuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIFJlcGxhY2VtZW50ICg9ZHVtbXkpIGZvciBHTlUvTGludXggZGl2aXNpb24tYnkgemVybyBoYW5kbGVyICovCit2b2lkIF9fZGl2MCAodm9pZCkKK3sKKwlleHRlcm4gdm9pZCBoYW5nICh2b2lkKTsKKworCWhhbmcoKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9lY2MuYyBiL3gtbG9hZGVyL2xpYi9lY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGZjNDBkCi0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL2VjYy5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAwIFRleGFzIEluc3RydW1lbnRzCisgKiAKKyAqIFRoaXMgZmlsZSBvcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHUtYm9vdCBmaWxlOgorICoJY29tbW9uL2NtZF9uYW5kLmMKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisNCisvKgorICogUHJlLWNhbGN1bGF0ZWQgMjU2LXdheSAxIGJ5dGUgY29sdW1uIHBhcml0eQorICovCitzdGF0aWMgY29uc3QgdV9jaGFyIG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbXSA9IHsKKwkweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwLAorCTB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsCisJMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwKKwkweDAzLCAweDU2LCAweDU1LCAweDAwLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDAwLCAweDU1LCAweDU2LCAweDAzLAorCTB4NjksIDB4M2MsIDB4M2YsIDB4NmEsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4NmEsIDB4M2YsIDB4M2MsIDB4NjksCisJMHgwYywgMHg1OSwgMHg1YSwgMHgwZiwgMHg1NSwgMHgwMCwgMHgwMywgMHg1NiwgMHg1NiwgMHgwMywgMHgwMCwgMHg1NSwgMHgwZiwgMHg1YSwgMHg1OSwgMHgwYywKKwkweDBmLCAweDVhLCAweDU5LCAweDBjLCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDBjLCAweDU5LCAweDVhLCAweDBmLAorCTB4NmEsIDB4M2YsIDB4M2MsIDB4NjksIDB4MzMsIDB4NjYsIDB4NjUsIDB4MzAsIDB4MzAsIDB4NjUsIDB4NjYsIDB4MzMsIDB4NjksIDB4M2MsIDB4M2YsIDB4NmEsCisJMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwKKwkweDBmLCAweDVhLCAweDU5LCAweDBjLCAweDU2LCAweDAzLCAweDAwLCAweDU1LCAweDU1LCAweDAwLCAweDAzLCAweDU2LCAweDBjLCAweDU5LCAweDVhLCAweDBmLAorCTB4MGMsIDB4NTksIDB4NWEsIDB4MGYsIDB4NTUsIDB4MDAsIDB4MDMsIDB4NTYsIDB4NTYsIDB4MDMsIDB4MDAsIDB4NTUsIDB4MGYsIDB4NWEsIDB4NTksIDB4MGMsCisJMHg2OSwgMHgzYywgMHgzZiwgMHg2YSwgMHgzMCwgMHg2NSwgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHg2NSwgMHgzMCwgMHg2YSwgMHgzZiwgMHgzYywgMHg2OSwKKwkweDAzLCAweDU2LCAweDU1LCAweDAwLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDAwLCAweDU1LCAweDU2LCAweDAzLAorCTB4NjYsIDB4MzMsIDB4MzAsIDB4NjUsIDB4M2YsIDB4NmEsIDB4NjksIDB4M2MsIDB4M2MsIDB4NjksIDB4NmEsIDB4M2YsIDB4NjUsIDB4MzAsIDB4MzMsIDB4NjYsCisJMHg2NSwgMHgzMCwgMHgzMywgMHg2NiwgMHgzYywgMHg2OSwgMHg2YSwgMHgzZiwgMHgzZiwgMHg2YSwgMHg2OSwgMHgzYywgMHg2NiwgMHgzMywgMHgzMCwgMHg2NSwKKwkweDAwLCAweDU1LCAweDU2LCAweDAzLCAweDU5LCAweDBjLCAweDBmLCAweDVhLCAweDVhLCAweDBmLCAweDBjLCAweDU5LCAweDAzLCAweDU2LCAweDU1LCAweDAwCit9OworCisKKy8qCisgKiBDcmVhdGVzIG5vbi1pbnZlcnRlZCBFQ0MgY29kZSBmcm9tIGxpbmUgcGFyaXR5CisgKi8KK3N0YXRpYyB2b2lkIG5hbmRfdHJhbnNfcmVzdWx0KHVfY2hhciByZWcyLCB1X2NoYXIgcmVnMywKKwl1X2NoYXIgKmVjY19jb2RlKQoreworCXVfY2hhciBhLCBiLCBpLCB0bXAxLCB0bXAyOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlhID0gYiA9IDB4ODA7CisJdG1wMSA9IHRtcDIgPSAwOworCisJLyogQ2FsY3VsYXRlIGZpcnN0IEVDQyBieXRlICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVnMyAmIGEpCQkvKiBMUDE1LDEzLDExLDkgLS0+IGVjY19jb2RlWzBdICovCisJCQl0bXAxIHw9IGI7CisJCWIgPj49IDE7CisJCWlmIChyZWcyICYgYSkJCS8qIExQMTQsMTIsMTAsOCAtLT4gZWNjX2NvZGVbMF0gKi8KKwkJCXRtcDEgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJYSA+Pj0gMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgc2Vjb25kIEVDQyBieXRlICovCisJYiA9IDB4ODA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVnMyAmIGEpCQkvKiBMUDcsNSwzLDEgLS0+IGVjY19jb2RlWzFdICovCisJCQl0bXAyIHw9IGI7CisJCWIgPj49IDE7CisJCWlmIChyZWcyICYgYSkJCS8qIExQNiw0LDIsMCAtLT4gZWNjX2NvZGVbMV0gKi8KKwkJCXRtcDIgfD0gYjsKKwkJYiA+Pj0gMTsKKwkJYSA+Pj0gMTsKKwl9CisKKwkvKiBTdG9yZSB0d28gb2YgdGhlIEVDQyBieXRlcyAqLworCWVjY19jb2RlWzBdID0gdG1wMTsKKwllY2NfY29kZVsxXSA9IHRtcDI7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgMyBieXRlIEVDQyBjb2RlIGZvciAyNTYgYnl0ZSBibG9jaworICovCisvKiBFQ0MgQ2FsY3VsYXRpb24gaXMgZGlmZmVyZW50IGJldHdlZW4gTkFORCBhbmQgTkFORCBMZWdhY3kgY29kZQorICogaW4gVS1Cb290LiBJZiBOQU5EX0xFR0FDWSBpcyBlbmFibGVkIGluIHUtYm9vdCBpdCBzaG91bGQgYmUgCisgKiBlbmFibGVkIGluIHRoZSBjb25maWcgZmlsZSBpbiB4LWxvYWRlciBhbHNvIAorICovCisjaWZkZWYgTkFORF9MRUdBQ1kKK3ZvaWQgbmFuZF9jYWxjdWxhdGVfZWNjIChjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwl1X2NoYXIgaWR4LCByZWcxLCByZWczOworCWludCBqOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlyZWcxID0gcmVnMyA9IDA7CisJZWNjX2NvZGVbMF0gPSBlY2NfY29kZVsxXSA9IGVjY19jb2RlWzJdID0gMDsKKworCS8qIEJ1aWxkIHVwIGNvbHVtbiBwYXJpdHkgKi8KKwlmb3IoaiA9IDA7IGogPCAyNTY7IGorKykgeworCisJCS8qIEdldCBDUDAgLSBDUDUgZnJvbSB0YWJsZSAqLworCQlpZHggPSBuYW5kX2VjY19wcmVjYWxjX3RhYmxlW2RhdFtqXV07CisJCXJlZzEgXj0gaWR4OworCisJCS8qIEFsbCBiaXQgWE9SID0gMSA/ICovCisJCWlmIChpZHggJiAweDQwKSB7CisJCQlyZWczIF49ICh1X2NoYXIpIGo7CisJCX0KKwl9CisKKwkvKiBDcmVhdGUgbm9uLWludmVydGVkIEVDQyBjb2RlIGZyb20gbGluZSBwYXJpdHkgKi8KKwluYW5kX3RyYW5zX3Jlc3VsdCgocmVnMSAmIDB4NDApID8gfnJlZzMgOiByZWczLCByZWczLCBlY2NfY29kZSk7CisKKwkvKiBDYWxjdWxhdGUgZmluYWwgRUNDIGNvZGUgKi8KKwllY2NfY29kZVswXSA9IH5lY2NfY29kZVswXTsKKwllY2NfY29kZVsxXSA9IH5lY2NfY29kZVsxXTsKKwllY2NfY29kZVsyXSA9ICgofnJlZzEpIDw8IDIpIHwgMHgwMzsKK30KKyNlbHNlCit2b2lkIG5hbmRfY2FsY3VsYXRlX2VjYyAoY29uc3QgdV9jaGFyICpkYXQsIHVfY2hhciAqZWNjX2NvZGUpCit7CisJdV9jaGFyIGlkeCwgcmVnMSwgcmVnMiwgcmVnMzsKKwlpbnQgajsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJcmVnMSA9IHJlZzIgPSByZWczID0gMDsKKwllY2NfY29kZVswXSA9IGVjY19jb2RlWzFdID0gZWNjX2NvZGVbMl0gPSAwOworCisJLyogQnVpbGQgdXAgY29sdW1uIHBhcml0eSAqLworCWZvcihqID0gMDsgaiA8IDI1NjsgaisrKSB7CisKKwkJLyogR2V0IENQMCAtIENQNSBmcm9tIHRhYmxlICovCisJCWlkeCA9IG5hbmRfZWNjX3ByZWNhbGNfdGFibGVbZGF0W2pdXTsKKwkJcmVnMSBePSAoaWR4ICYgMHgzZik7CisKKwkJLyogQWxsIGJpdCBYT1IgPSAxID8gKi8KKwkJaWYgKGlkeCAmIDB4NDApIHsKKwkJCXJlZzMgXj0gKHVfY2hhcikgajsKKwkJCXJlZzIgXj0gfigodV9jaGFyKSBqKTsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBub24taW52ZXJ0ZWQgRUNDIGNvZGUgZnJvbSBsaW5lIHBhcml0eSAqLworCW5hbmRfdHJhbnNfcmVzdWx0KHJlZzIsIHJlZzMsIGVjY19jb2RlKTsKKworCS8qIENhbGN1bGF0ZSBmaW5hbCBFQ0MgY29kZSAqLworCWVjY19jb2RlWzBdID0gfmVjY19jb2RlWzBdOworCWVjY19jb2RlWzFdID0gfmVjY19jb2RlWzFdOworCWVjY19jb2RlWzJdID0gKCh+cmVnMSkgPDwgMikgfCAweDAzOworfQorI2VuZGlmCisvKgorICogRGV0ZWN0IGFuZCBjb3JyZWN0IGEgMSBiaXQgZXJyb3IgZm9yIDI1NiBieXRlIGJsb2NrCisgKi8KK2ludCBuYW5kX2NvcnJlY3RfZGF0YSAodV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpCit7CisJdV9jaGFyIGEsIGIsIGMsIGQxLCBkMiwgZDMsIGFkZCwgYml0LCBpOworCisJLyogRG8gZXJyb3IgZGV0ZWN0aW9uICovCisJZDEgPSBjYWxjX2VjY1swXSBeIHJlYWRfZWNjWzBdOworCWQyID0gY2FsY19lY2NbMV0gXiByZWFkX2VjY1sxXTsKKwlkMyA9IGNhbGNfZWNjWzJdIF4gcmVhZF9lY2NbMl07CisKKwlpZiAoKGQxIHwgZDIgfCBkMykgPT0gMCkgeworCQkvKiBObyBlcnJvcnMgKi8KKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeworCQlhID0gKGQxIF4gKGQxID4+IDEpKSAmIDB4NTU7CisJCWIgPSAoZDIgXiAoZDIgPj4gMSkpICYgMHg1NTsKKwkJYyA9IChkMyBeIChkMyA+PiAxKSkgJiAweDU0OworCisJCS8qIEZvdW5kIGFuZCB3aWxsIGNvcnJlY3Qgc2luZ2xlIGJpdCBlcnJvciBpbiB0aGUgZGF0YSAqLworCQlpZiAoKGEgPT0gMHg1NSkgJiYgKGIgPT0gMHg1NSkgJiYgKGMgPT0gMHg1NCkpIHsKKwkJCWMgPSAweDgwOworCQkJYWRkID0gMDsKKwkJCWEgPSAweDgwOworCQkJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCQkJaWYgKGQxICYgYykKKwkJCQkJYWRkIHw9IGE7CisJCQkJYyA+Pj0gMjsKKwkJCQlhID4+PSAxOworCQkJfQorCQkJYyA9IDB4ODA7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCQlpZiAoZDIgJiBjKQorCQkJCQlhZGQgfD0gYTsKKwkJCQljID4+PSAyOworCQkJCWEgPj49IDE7CisJCQl9CisJCQliaXQgPSAwOworCQkJYiA9IDB4MDQ7CisJCQljID0gMHg4MDsKKwkJCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQkJCWlmIChkMyAmIGMpCisJCQkJCWJpdCB8PSBiOworCQkJCWMgPj49IDI7CisJCQkJYiA+Pj0gMTsKKwkJCX0KKwkJCWIgPSAweDAxOworCQkJYSA9IGRhdFthZGRdOworCQkJYSBePSAoYiA8PCBiaXQpOworCQkJZGF0W2FkZF0gPSBhOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZSB7CisJCQlpID0gMDsKKwkJCXdoaWxlIChkMSkgeworCQkJCWlmIChkMSAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMSA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMikgeworCQkJCWlmIChkMiAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMiA+Pj0gMTsKKwkJCX0KKwkJCXdoaWxlIChkMykgeworCQkJCWlmIChkMyAmIDB4MDEpCisJCQkJCSsraTsKKwkJCQlkMyA+Pj0gMTsKKwkJCX0KKwkJCWlmIChpID09IDEpIHsKKwkJCQkvKiBFQ0MgQ29kZSBFcnJvciBDb3JyZWN0aW9uICovCisJCQkJcmVhZF9lY2NbMF0gPSBjYWxjX2VjY1swXTsKKwkJCQlyZWFkX2VjY1sxXSA9IGNhbGNfZWNjWzFdOworCQkJCXJlYWRfZWNjWzJdID0gY2FsY19lY2NbMl07CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBVbmNvcnJlY3RhYmxlIEVycm9yICovCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJfQorCisJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCXJldHVybiAtMTsKK30KKwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL29tYXBfYmNoLmMgYi94LWxvYWRlci9saWIvb21hcF9iY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQyNGE2Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL29tYXBfYmNoLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBvbWFwX2JjaC5jCisgKgorICogU3VwcG9ydCBtb2R1bGVzIGZvciBCQ0ggNC1iaXQvOC1iaXQgZXJyb3IgY29ycmVjdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIHsyMDExfSBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorCisjZGVmaW5lIEdQTUNfRUNDX0JDSF9SRVNVTFRfMCAgIDB4MjQwCisjZGVmaW5lIFBBR0VfU0laRSAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTkFORF9FQ0NfUkVBRCAgICAgICAgICAgMAorI2RlZmluZSBOQU5EX0VDQ19XUklURSAgICAgICAgICAxCisjZGVmaW5lIF9fcmF3X3dyaXRlbCh2LGEpICgqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShhKSA9ICh2KSkKKyNkZWZpbmUgX19yYXdfcmVhZGwoYSkgICAgKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGEpKQorCitpbnQgZGVjb2RlX2JjaChpbnQgc2VsZWN0XzRfOCwgdW5zaWduZWQgY2hhciAqZWNjLCB1bnNpZ25lZCBpbnQgKmVycl9sb2MpOworCisvKgorICogIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4IC0gVmVyc2lvbiBmb3IgOEJJVCBCQ0ggY29ycmVjdGlvbi4KKyAqCisgKiAgQGRhdDoJdW51c2VkCisgKiAgQGVjY19jb2RlOgllY2NfY29kZSBidWZmZXIKKyAqLworaW50IG9tYXBfY2FsY3VsYXRlX2VjY19iY2g4KGNvbnN0IHVpbnQ4X3QgKmRhdCwKKwkJCQkgICB1aW50OF90ICplY2NfY29kZSkKK3sKKyAgdW5zaWduZWQgbG9uZyByZWcsIHZhbDEgPSAweDAsIHZhbDIgPSAweDA7CisgIHVuc2lnbmVkIGxvbmcgdmFsMyA9IDB4MCwgdmFsNCA9IDB4MDsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRS81MTI7IGkrKykgeworICAgIC8qIFJlYWRpbmcgSFcgRUNDX0JDSF9SZXN1bHRzCisgICAgICogMHgyNDAtMHgyNEMsIDB4MjUwLTB4MjVDLCAweDI2MC0weDI2QywgMHgyNzAtMHgyN0MKKyAgICAgKi8KKyAgICByZWcgPSAodW5zaWduZWQgbG9uZykoR1BNQ19CQVNFICsKKwkJCSAgR1BNQ19FQ0NfQkNIX1JFU1VMVF8wICsgKDB4MTAgKiBpKSk7CisgICAgdmFsMSA9IF9fcmF3X3JlYWRsKHJlZyk7CisgICAgdmFsMiA9IF9fcmF3X3JlYWRsKHJlZyArIDQpOworICAgIHZhbDMgPSBfX3Jhd19yZWFkbChyZWcgKyA4KTsKKyAgICB2YWw0ID0gX19yYXdfcmVhZGwocmVnICsgMTIpOworCisgICAgKmVjY19jb2RlKysgPSAodmFsNCAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDI0KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwzID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMyAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDI0KSAmIDB4RkYpOworCisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDIgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwyICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMjQpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gMTYpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAoKHZhbDEgPj4gOCkgJiAweEZGKTsKKyAgICAqZWNjX2NvZGUrKyA9ICh2YWwxICYgMHhGRik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQgLSBWZXJzaW9uIGZvciA0QklUIEJDSCBjb3JyZWN0aW9uLgorICoKKyAqICBAZGF0Ogl1bnVzZWQKKyAqICBAZWNjX2NvZGU6CWVjY19jb2RlIGJ1ZmZlcgorICovCitpbnQgb21hcF9jYWxjdWxhdGVfZWNjX2JjaDQoY29uc3QgdWludDhfdCAqZGF0LAorCQkJCSAgIHVpbnQ4X3QgKmVjY19jb2RlKQoreworICB1bnNpZ25lZCBsb25nIHJlZywgdmFsMSA9IDB4MCwgdmFsMiA9IDB4MDsJCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUvNTEyOyBpKyspIHsKKyAgICAvKiBSZWFkaW5nIEhXIEVDQ19CQ0hfUmVzdWx0cworICAgICAqIDB4MjQwLTB4MjRDLCAweDI1MC0weDI1QywgMHgyNjAtMHgyNkMsIDB4MjcwLTB4MjdDCisgICAgICovCisgICAgcmVnID0gKHVuc2lnbmVkIGxvbmcpKEdQTUNfQkFTRSArCisJCQkgIEdQTUNfRUNDX0JDSF9SRVNVTFRfMCArICgweDEwICogaSkpOworICAgIHZhbDEgPSBfX3Jhd19yZWFkbChyZWcpOworICAgIHZhbDIgPSBfX3Jhd19yZWFkbChyZWcgKyA0KTsKKworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwyID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMiAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDI0KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDE2KSAmIDB4RkYpOworICAgICplY2NfY29kZSsrID0gKCh2YWwxID4+IDgpICYgMHhGRik7CisgICAgKmVjY19jb2RlKysgPSAodmFsMSAmIDB4RkYpOworICB9CisgIHJldHVybiAwOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBmb3IgNGIvOGIgQkNIIGNvcnJlY3Rpb24uICBQYXNzIGVpdGhlciA0IG9yIDggaW50byB0aGUgCisgICBjb3JyZWN0X2JpdHMgcGFyYW1ldGVyLiAqLworc3RhdGljIGludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2goaW50IGNvcnJlY3RfYml0cywgdWludDhfdCAqZGF0LAorCQkJCSB1aW50OF90ICpyZWFkX2VjYywgdWludDhfdCAqY2FsY19lY2MpCit7CisgIGludCBpPTAsIGJsb2NrQ250PTQsIGosIGVjY2ZsYWcsIGNvdW50LCBjb3JyZWN0ZWQ9MDsKKyAgaW50IGVjY3NpemUgPSAoY29ycmVjdF9iaXRzID09IDgpID8gMTMgOiA3OworICBpbnQgbW9kZSA9IChjb3JyZWN0X2JpdHMgPT0gOCkgPyAxIDogMDsKKyAgdW5zaWduZWQgaW50IGVycl9sb2NbOF07CisKKyAgaWYgKGNvcnJlY3RfYml0cyA9PSA0KQorICAgIG9tYXBfY2FsY3VsYXRlX2VjY19iY2g0KGRhdCwgY2FsY19lY2MpOworICBlbHNlIGlmIChjb3JyZWN0X2JpdHMgPT0gOCkKKyAgICBvbWFwX2NhbGN1bGF0ZV9lY2NfYmNoOChkYXQsIGNhbGNfZWNjKTsKKyAgZWxzZQorICAgIHJldHVybiAtMTsgIC8qIHVuc3VwcG9ydGVkIG51bWJlciBvZiBjb3JyZWN0aW9uIGJpdHMgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDbnQ7IGkrKykgeworICAgIC8qIGNoZWNrIGlmIGFueSBlY2MgZXJyb3IgKi8KKyAgICBlY2NmbGFnID0gMDsKKyAgICBmb3IgKGogPSAwOyAoaiA8IGVjY3NpemUpICYmIChlY2NmbGFnID09IDApOyBqKyspCisgICAgICBpZiAoY2FsY19lY2Nbal0gIT0gMCkKKwllY2NmbGFnID0gMTsKKworICAgIGlmIChlY2NmbGFnID09IDEpIHsKKyAgICAgIGVjY2ZsYWcgPSAwOworICAgICAgZm9yIChqID0gMDsgKGogPCBlY2NzaXplKSAmJiAoZWNjZmxhZyA9PSAwKTsgaisrKQorCWlmIChyZWFkX2VjY1tqXSAhPSAweEZGKQorCSAgZWNjZmxhZyA9IDE7CisgICAgfQorCisgICAgaWYgKGVjY2ZsYWcgPT0gMSkgeworICAgICAgY291bnQgPSAwOworICAgICAgLypwcmludGsoS0VSTl9JTkZPICIuLi5iY2ggY29ycmVjdCglZCA1MTIgYnl0ZSlcbiIsIGkrMSk7Ki8KKyAgICAgIGNvdW50ID0gZGVjb2RlX2JjaChtb2RlLCBjYWxjX2VjYywgZXJyX2xvYyk7CisgICAgICAKKyAgICAgIC8qCisgICAgICAgKiBJZiB1bmNvcnJlY3RhYmxlIGVycm9yIGRldGVjdGVkIGluIHN1Yi1wYWdlLAorICAgICAgICoga2VlcCB1bmNvcnJlY3RhYmxlIGZsYWcgdG8gdXBwZXIgbGF5ZXIKKyAgICAgICAqLworICAgICAgaWYoY291bnQgPT0gLTEpCisgICAgICAgIGNvcnJlY3RlZCA9IC0xOworICAgICAgLyoKKyAgICAgICAqIElmIG5vIHVuY29ycmVjdGFibGUgZXJyb3IgdGhlbiBpbmNyZW1lbnQKKyAgICAgICAqIGNvcnJlY3RlZCBjb3VudAorICAgICAgICovCisgICAgICBpZihjb3JyZWN0ZWQgIT0gLTEpCisgICAgICAgIGNvcnJlY3RlZCArPSBjb3VudDsKKwkJCQorICAgICAgZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkvKnByaW50ayhLRVJOX0lORk8gImVycl9sb2M9JWRcbiIsIGVycl9sb2Nbal0pOyovCisgICAgICAgIHByaW50ZigiZXJyX2xvYz0lZFxuIiwgZXJyX2xvY1tqXSk7CisJaWYgKGVycl9sb2Nbal0gPCA0MDk2KQorCSAgZGF0W2Vycl9sb2Nbal0gPj4gM10gXj0gMSA8PCAoZXJyX2xvY1tqXSAmIDcpOworCS8qIGVsc2UsIG5vdCBpbnRlcmVzdGVkIHRvIGNvcnJlY3QgZWNjICovCisgICAgICB9CisKKyAgICB9CisKKyAgICBjYWxjX2VjYyA9IGNhbGNfZWNjICsgZWNjc2l6ZTsKKyAgICByZWFkX2VjYyA9IHJlYWRfZWNjICsgZWNjc2l6ZTsKKyAgICBkYXQgKz0gNTEyOworICB9CisKKyAgcmV0dXJuIGNvcnJlY3RlZDsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbiBmb3IgNCBiaXQgQkNIIGNvcnJlY3Rpb24gKi8KK2ludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g0KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworICByZXR1cm4gb21hcF9jb3JyZWN0X2RhdGFfYmNoKDQsIGRhdCwgcmVhZF9lY2MsIGNhbGNfZWNjKTsKK30KKworLyogV3JhcHBlciBmdW5jdGlvbiBmb3IgOCBiaXQgQkNIIGNvcnJlY3Rpb24gKi8KK2ludCBvbWFwX2NvcnJlY3RfZGF0YV9iY2g4KHVpbnQ4X3QgKmRhdCwgdWludDhfdCAqcmVhZF9lY2MsIHVpbnQ4X3QgKmNhbGNfZWNjKQoreworICByZXR1cm4gb21hcF9jb3JyZWN0X2RhdGFfYmNoKDgsIGRhdCwgcmVhZF9lY2MsIGNhbGNfZWNjKTsKK30KKworLyoKKyAqIG9tYXBfZW5hYmxlX2VjYyAtIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgaGFyZHdhcmUgZWNjIGZ1bmN0aW9uYWxpdHkKKyAqIEBtdGQ6ICAgICAgICBNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQG1vZGU6ICAgICAgIFJlYWQvV3JpdGUgbW9kZQorICovCit2b2lkIG9tYXBfZW5hYmxlX2h3ZWNjX2JjaDQodWludDMyX3QgYnVzX3dpZHRoLCBpbnQzMl90IG1vZGUpCit7CisgIHVpbnQzMl90IGJjaF9tb2Q9MDsKKyAgdWludDMyX3QgZGV2X3dpZHRoID0gKGJ1c193aWR0aD09OCk/MDoxOworICB1bnNpZ25lZCBpbnQgZWNjc2l6ZTEsIGVjY3NpemUwOworICB1bnNpZ25lZCBpbnQgZWNjX2NvbmZfdmFsID0gMCwgZWNjX3NpemVfY29uZl92YWwgPSAwOworCisgIHN3aXRjaCAobW9kZSkgeworICBjYXNlIE5BTkRfRUNDX1JFQUQgICAgOgorICAgIGVjY3NpemUxID0gMHhEOyBlY2NzaXplMCA9IDB4NDg7CisgICAgLyogRUNDU0laRTE9MjYgfCBFQ0NTSVpFMD0xMiAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDkgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBjYXNlIE5BTkRfRUNDX1dSSVRFICAgOgorICAgIGVjY3NpemUxID0gMHgyMDsgZWNjc2l6ZTAgPSAweDAwOworCisgICAgLyogRUNDU0laRTE9MzIgfCBFQ0NTSVpFMD0wMCAqLworICAgIGVjY19zaXplX2NvbmZfdmFsID0gKGVjY3NpemUxIDw8IDIyKSB8IChlY2NzaXplMCA8PCAxMik7CisKKyAgICAvKiBFQ0NBTEdPUklUSE0gfCBFQ0NCQ0hUOCB8IEVDQ1dSQVBNT0RFIHwgRUNDMTZCIHwKKyAgICAgKiBFQ0NUT1BTRUNUT1IgfCBFQ0NDUyB8IEVDQyBFbmFibGUKKyAgICAgKi8KKyAgICBlY2NfY29uZl92YWwgPSAoKDB4MDEgPDwgMTYpIHwgKGJjaF9tb2QgPDwgMTIpIHwgKDB4MDYgPDwgOCkgfAorCQkgICAgKGRldl93aWR0aCA8PCA3KSB8ICgweDAzIDw8IDQpIHwKKwkJICAgICgwIDw8IDEpIHwgKDB4MSkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHByaW50ZigiRXJyb3I6IFVucmVjb2duaXplZCBNb2RlWyVkXSFcbiIsIG1vZGUpOworICAgIGJyZWFrOworICB9CisKKyAgX19yYXdfd3JpdGVsKDB4MSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19zaXplX2NvbmZfdmFsLCAoR1BNQ19FQ0NfU0laRV9DT05GSUcpKTsKKyAgX19yYXdfd3JpdGVsKGVjY19jb25mX3ZhbCwgKEdQTUNfRUNDX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoMHgxMDEsIChHUE1DX0VDQ19DT05UUk9MKSk7Cit9CisKKy8qCisgKiBvbWFwX2VuYWJsZV9lY2MgLSBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGhhcmR3YXJlIGVjYyBmdW5jdGlvbmFsaXR5CisgKiBAbXRkOiAgICAgICAgTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBtb2RlOiAgICAgICBSZWFkL1dyaXRlIG1vZGUKKyAqLwordm9pZCBvbWFwX2VuYWJsZV9od2VjY19iY2g4KHVpbnQzMl90IGJ1c193aWR0aCwgaW50MzJfdCBtb2RlKQoreworICB1aW50MzJfdCBiY2hfbW9kPTE7CisgIHVpbnQzMl90IGRldl93aWR0aCA9IChidXNfd2lkdGg9PTgpPzA6MTsKKyAgdW5zaWduZWQgaW50IGVjY3NpemUxLCBlY2NzaXplMDsKKyAgdW5zaWduZWQgaW50IGVjY19jb25mX3ZhbCA9IDAsIGVjY19zaXplX2NvbmZfdmFsID0gMDsKKworICBzd2l0Y2ggKG1vZGUpIHsKKyAgY2FzZSBOQU5EX0VDQ19SRUFEICAgIDoKKyAgICBlY2NzaXplMSA9IDB4MUE7IGVjY3NpemUwID0gMHgxODsKKyAgICAvKiBFQ0NTSVpFMT0yNiB8IEVDQ1NJWkUwPTEyICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNCA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGNhc2UgTkFORF9FQ0NfV1JJVEUgICA6CisgICAgZWNjc2l6ZTEgPSAweDIwOyBlY2NzaXplMCA9IDB4MDA7CisKKyAgICAvKiBFQ0NTSVpFMT0zMiB8IEVDQ1NJWkUwPTAwICovCisgICAgZWNjX3NpemVfY29uZl92YWwgPSAoZWNjc2l6ZTEgPDwgMjIpIHwgKGVjY3NpemUwIDw8IDEyKTsKKworICAgIC8qIEVDQ0FMR09SSVRITSB8IEVDQ0JDSFQ4IHwgRUNDV1JBUE1PREUgfCBFQ0MxNkIgfAorICAgICAqIEVDQ1RPUFNFQ1RPUiB8IEVDQ0NTIHwgRUNDIEVuYWJsZQorICAgICAqLworICAgIGVjY19jb25mX3ZhbCA9ICgoMHgwMSA8PCAxNikgfCAoYmNoX21vZCA8PCAxMikgfCAoMHgwNiA8PCA4KSB8CisJCSAgICAoZGV2X3dpZHRoIDw8IDcpIHwgKDB4MDMgPDwgNCkgfAorCQkgICAgKDAgPDwgMSkgfCAoMHgxKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcHJpbnRmKCJFcnJvcjogVW5yZWNvZ25pemVkIE1vZGVbJWRdIVxuIiwgbW9kZSk7CisgICAgYnJlYWs7CisgIH0KKworICBfX3Jhd193cml0ZWwoMHgxLCAoR1BNQ19FQ0NfQ09OVFJPTCkpOworICBfX3Jhd193cml0ZWwoZWNjX3NpemVfY29uZl92YWwsIChHUE1DX0VDQ19TSVpFX0NPTkZJRykpOworICBfX3Jhd193cml0ZWwoZWNjX2NvbmZfdmFsLCAoR1BNQ19FQ0NfQ09ORklHKSk7CisgIF9fcmF3X3dyaXRlbCgweDEwMSwgKEdQTUNfRUNDX0NPTlRST0wpKTsKK30KZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9vbWFwX2JjaF9kZWNvZGVyLmMgYi94LWxvYWRlci9saWIvb21hcF9iY2hfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3N2U5M2MKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvb21hcF9iY2hfZGVjb2Rlci5jCkBAIC0wLDAgKzEsNDA1IEBACisvKgorICogbGliL29tYXBfYmNoX2RlY29kZXIuYworICoKKyAqIFdob2xlIEJDSCBFQ0MgRGVjb2RlciAoUG9zdCBoYXJkd2FyZSBnZW5lcmF0ZWQgc3luZHJvbWUgZGVjb2RpbmcpCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRleGFzIEluc3RydW1lbnRzCisgKgorICogQXV0aG9yOiBTdWt1bWFyIEdob3JhaSA8cy1naG9yYWlAdGkuY29tCisgKgkJICAgTWljaGFlbCBGaWxsaW5nZXIgPG0tZmlsbGluZ2VyQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgcHJpbnRrIC8vcHJpbnRmCisKKyNkZWZpbmUgbW0JCTEzCisjZGVmaW5lIGtrX3Nob3J0ZW4JNDA5NgorI2RlZmluZSBubgkJODE5MQkvKiBMZW5ndGggb2YgY29kZXdvcmQsIG4gPSAyKiptbSAtIDEgKi8KKworI2RlZmluZSBQUFAJMHgyMDFCCS8qIFByaW1hcnkgUG9seW5vbWlhbCA6IHheMTMgKyB4XjQgKyB4XjMgKyB4ICsgMSAqLworI2RlZmluZSBQCTB4MDAxQgkvKiBXaXRoIG9taXR0ZWQgeF4xMyAqLworI2RlZmluZSBQT0xZCTEyCS8qIGRlZ3JlZSBvZiB0aGUgcHJpbWFyeSBQb2x5bm9taWFsIGxlc3Mgb25lICovCisKKy8qKgorICogbXB5X21vZF9nZiAtIEdBTE9JUyBmaWVsZCBtdWx0aXBsaWVyCisgKiBJbnB1dCAgOiBBKHgpLCBCKHgpCisgKiBPdXRwdXQgOiBBKHgpKkIoeCkgbW9kIFAoeCkKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtcHlfbW9kX2dmKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYikKK3sKKwl1bnNpZ25lZCBpbnQgUiA9IDA7CisJdW5zaWduZWQgaW50IFIxID0gMDsKKwl1bnNpZ25lZCBpbnQgayA9IDA7CisKKwlmb3IgKGsgPSAwOyBrIDwgbW07IGsrKykgeworCisJCVIgPSAoUiA8PCAxKSAmIDB4MUZGRTsKKwkJaWYgKFIxID09IDEpCisJCQlSIF49IFA7CisKKwkJaWYgKCgoYSA+PiAoUE9MWSAtIGspKSAmIDEpID09IDEpCisJCQlSIF49IGI7CisKKwkJaWYgKGsgPCBQT0xZKQorCQkJUjEgPSAoUiA+PiBQT0xZKSAmIDE7CisJfQorCXJldHVybiBSOworfQorCisvKioKKyAqIGNoaWVuIC0gQ0hJRU4gc2VhcmNoCisgKgorICogQGxvY2F0aW9uIC0gRXJyb3IgbG9jYXRpb24gdmVjdG9yIHBvaW50ZXIKKyAqCisgKiBJbnB1dHMgIDogRUxQKHopCisgKgkgICAgIE5vLiBvZiBmb3VuZCBlcnJvcnMKKyAqCSAgICAgU2l6ZSBvZiBpbnB1dCBjb2Rld29yZAorICogT3V0cHV0cyA6IFVwIHRvIDggbG9jYXRpb25zCisgKgkgICAgIE5vLiBvZiBlcnJvcnMKKyAqLworc3RhdGljIGludCBjaGllbih1bnNpZ25lZCBpbnQgc2VsZWN0XzRfOCwgaW50IGVycl9udW1zLAorCQkJCXVuc2lnbmVkIGludCBlcnJbXSwgdW5zaWduZWQgaW50ICpsb2NhdGlvbikKK3sKKwlpbnQgaSwgY291bnQ7IC8qIE51bWJlciBvZiBkZWN0ZWN0ZWQgZXJyb3JzICovCisJLyogQ29udGFpbnMgYWNjdW11bGF0aW9uIG9mIGV2YWx1YXRpb24gYXQgeF5pIChpOjEtPjgpICovCisJdW5zaWduZWQgaW50IGdhbW1hc1s4XTsKKwl1bnNpZ25lZCBpbnQgYWxwaGE7CisJdW5zaWduZWQgaW50IGJpdCwgZWNjX2JpdHM7CisJdW5zaWduZWQgaW50IGVscF9zdW07CisKKwllY2NfYml0cyA9IChzZWxlY3RfNF84ID09IDApID8gNTIgOiAxMDQ7CisJCisJLyogU3RhcnQgZXZhbHVhdGlvbiBhdCBBbHBoYSoqODE5MiBhbmQgZGVjcmVhc2luZyAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWdhbW1hc1tpXSA9IGVycltpXTsKKworCWNvdW50ID0gMDsKKwlmb3IgKGkgPSAxOyAoaSA8PSBubikgJiYgKGNvdW50IDwgZXJyX251bXMpOyBpKyspIHsKKworCQkvKiBSZXN1bHQgb2YgZXZhbHVhdGlvbiBhdCByb290ICovCisJCWVscF9zdW0gPSAxIF4gZ2FtbWFzWzBdIF4gZ2FtbWFzWzFdIF4KKwkJCQlnYW1tYXNbMl0gXiBnYW1tYXNbM10gXgorCQkJCWdhbW1hc1s0XSBeIGdhbW1hc1s1XSBeCisJCQkJZ2FtbWFzWzZdIF4gZ2FtbWFzWzddOworCisJCWFscGhhID0gUFBQID4+IDE7CisJCWdhbW1hc1swXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzBdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0yICovCisJCWdhbW1hc1sxXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzFdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0yICovCisJCWdhbW1hc1syXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzJdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi0zICovCisJCWdhbW1hc1szXSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzNdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi00ICovCisJCWdhbW1hc1s0XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzRdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi01ICovCisJCWdhbW1hc1s1XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzVdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi02ICovCisJCWdhbW1hc1s2XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzZdLCBhbHBoYSk7CisJCWFscGhhID0gbXB5X21vZF9nZihhbHBoYSwgKFBQUCA+PiAxKSk7CS8qIHggYWxwaGhhXi03ICovCisJCWdhbW1hc1s3XSA9IG1weV9tb2RfZ2YoZ2FtbWFzWzddLCBhbHBoYSk7CisKKwkJaWYgKGVscF9zdW0gPT0gMCkgeworCQkJLyogY2FsY3VsYXRlIGxvY2F0aW9uICovCisJCQliaXQgPSAoKGktMSkgJiB+Nyl8KDctKChpLTEpICYgNykpOworCQkJbG9jYXRpb25bY291bnQrK10gPSBra19zaG9ydGVuIC0gKGJpdCAtIDIgKiBlY2NfYml0cykgLSAxOworCQl9CisJfQorCisJLyogRmFpbHVyZTogTm8uIG9mIGRldGVjdGVkIGVycm9ycyAhPSBOby4gb3IgY29ycmVjdGVkIGVycm9ycyAqLworCWlmIChjb3VudCAhPSBlcnJfbnVtcykgeworCQljb3VudCA9IC0xOworCQkvKglwcmludGsoS0VSTl9JTkZPICJCQ0ggZGVjb2RpbmcgZmFpbGVkXG4iKTsqLworCX0KKwkvKgorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICIlZCAiLCBsb2NhdGlvbltpXSk7CisJKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIHN5bmQgOiAxNiBTeW5kcm9tZXMKKyAqIHJldHVybjogZ2FtYWFzIC0gQ29lZmZpY2llbnRzIHRvIHRoZSBlcnJvciBwb2x5bm9taWFsCisgKiByZXR1cm46IDogTnVtYmVyIG9mIGRldGVjdGVkIGVycm9ycworKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmVybGVrYW1wKHVuc2lnbmVkIGludCBzZWxlY3RfNF84LAorCQkJdW5zaWduZWQgaW50IHN5bmRbXSwgdW5zaWduZWQgaW50IGVycltdKQoreworCWludCBsb29wLCBpdGVyYXRpb247CisJdW5zaWduZWQgaW50IExMID0gMDsJCS8qIERldGVjdGVkIGVycm9ycyAqLworCXVuc2lnbmVkIGludCBkID0gMDsJLyogRGlzdGFuY2UgYmV0d2VlbiBTeW5kcm9tZXMgYW5kIEVMUFtuXSh6KSAqLworCXVuc2lnbmVkIGludCBpbnZkID0gMDsJCS8qIEludmVyc2Ugb2YgZCAqLworCS8qIEludGVybWVkaWF0ZSBFTFBbbl0oeikuCisJICogRmluYWwgRUxQW25dKHopIGlzIEVycm9yIExvY2F0aW9uIFBvbHlub21pYWwKKwkgKi8KKwl1bnNpZ25lZCBpbnQgZ2FtbWFzWzE2XTsKKwkvKiBJbnRlcm1lZGlhdGUgbm9ybWFsaXplZCBFTFBbbl0oeikgOiBEW25dKHopICovCisJdW5zaWduZWQgaW50IERbMTZdOworCS8qIFRlbXBvcmFyeSB2YWx1ZSB0aGF0IGhvbGRzIGFuIEVMUFtuXSh6KSBjb2VmZmljaWVudCAqLworCXVuc2lnbmVkIGludCBuZXh0X2dhbW1hID0gMDsKKworCWludCBlID0gMDsKKwl1bnNpZ25lZCBpbnQgc2lnbiA9IDA7CisJdW5zaWduZWQgaW50IHUgPSAwOworCXVuc2lnbmVkIGludCB2ID0gMDsKKwl1bnNpZ25lZCBpbnQgQzEgPSAwLCBDMiA9IDA7CisJdW5zaWduZWQgaW50IHNzID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wX3YgPSAwLCB0bXBfcyA9IDA7CisJdW5zaWduZWQgaW50IHRtcF9wb2x5OworCisJLyotLS0tLS0tLS0tLS0tLSBTdGVwIDAgLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTY7IGxvb3ArKykgeworCQlnYW1tYXNbbG9vcF0gPSAwOworCQlEW2xvb3BdID0gMDsKKwl9CisKKwlnYW1tYXNbMF0gPSAxOworCURbMV0gPSAxOworCisJaXRlcmF0aW9uID0gMDsKKwlMTCA9IDA7CisJd2hpbGUgKChpdGVyYXRpb24gPCAoKHNlbGVjdF80XzgrMSkqMio0KSkgJiYKKwkJCShMTCA8PSAoKHNlbGVjdF80XzgrMSkqNCkpKSB7CisKKwkgIC8qcHJpbnRrKEtFUk5fSU5GTyAiXG5JdGVyYXRpb24uLi4uLi4uLi4uLi4uJWRcbiIsIGl0ZXJhdGlvbik7Ki8KKwkJZCA9IDA7CisJCS8qIFN0ZXA6IDAgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8PSBMTDsgbG9vcCsrKSB7CisJCQl0bXBfcG9seSA9IG1weV9tb2RfZ2YoCisJCQkJCWdhbW1hc1tsb29wXSwgc3luZFtpdGVyYXRpb24gLSBsb29wXSk7CisJCQlkIF49IHRtcF9wb2x5OworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTAgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIHRtcF9wb2x5KTsqLworCQl9CisKKwkJLyogU3RlcCAxOiAxIGN5Y2xlIG9ubHkgdG8gcGVyZm9ybSBpbnZlcnNpb24gKi8KKwkJdiA9IGQgPDwgMTsKKwkJZSA9IC0xOworCQlzaWduID0gMTsKKwkJc3MgPSAweDIwMDA7CisJCWludmQgPSAwOworCQl1ID0gUFBQOworCQlmb3IgKGxvb3AgPSAwOyAoZCAhPSAwKSAmJiAobG9vcCA8PSAoMiAqIFBPTFkpKTsgbG9vcCsrKSB7CisJCSAgLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTEgTEw9JXggcG9seSBOVUxMXG4iLAorCQkgICAgbG9vcCwgTEwpOyovCisJCQlDMSA9ICh2ID4+IDEzKSAmIDE7CisJCQlDMiA9IEMxICYgc2lnbjsKKworCQkJc2lnbiBePSBDMiBeIChlID09IDApOworCisJCQl0bXBfdiA9IHY7CisJCQl0bXBfcyA9IHNzOworCisJCQlpZiAoQzEgPT0gMSkgeworCQkJCXYgXj0gdTsKKwkJCQlzcyBePSBpbnZkOworCQkJfQorCQkJdiA9ICh2IDw8IDEpICYgMHgzRkZGOworCQkJaWYgKEMyID09IDEpIHsKKwkJCQl1ID0gdG1wX3Y7CisJCQkJaW52ZCA9IHRtcF9zOworCQkJCWUgPSAtZTsKKwkJCX0KKwkJCWludmQgPj49IDE7CisJCQllLS07CisJCX0KKworCQlmb3IgKGxvb3AgPSAwOyAoZCAhPSAwKSAmJiAobG9vcCA8PSAoaXRlcmF0aW9uICsgMSkpOyBsb29wKyspIHsKKwkJCS8qIFN0ZXAgMgorCQkJICogSW50ZXJsZWF2ZWQgd2l0aCBTdGVwIDMsIGlmIEw8KG4taykKKwkJCSAqIGludmQ6IFVwZGF0ZSBvZiBFTFBbbl0oeikgPSBFTFBbbi0xXSh6KSAtIGQuRFtuLTFdKHopCisJCQkgKi8KKworCQkJLyogSG9sZHMgdmFsdWUgb2YgRUxQIGNvZWZmaWNpZW50IHVudGlsIHByZWNlZGVudAorCQkJICogdmFsdWUgZG9lcyBub3QgaGF2ZSB0byBiZSB1c2VkIGFueW1vcmUKKwkJCSAqLworCQkJdG1wX3BvbHkgPSBtcHlfbW9kX2dmKGQsIERbbG9vcF0pOworCQkJLypwcmludGsoS0VSTl9JTkZPICIlMDJkLiBzPTIgTEw9JXggcG9seSAleFxuIiwKKwkJCSAgbG9vcCwgTEwsIHRtcF9wb2x5KTsqLworCisJCQluZXh0X2dhbW1hID0gZ2FtbWFzW2xvb3BdIF4gdG1wX3BvbHk7CisJCQlpZiAoKDIgKiBMTCkgPCAoaXRlcmF0aW9uICsgMSkpIHsKKwkJCQkvKiBJbnRlcmxlYXZpbmcgd2l0aCBTdGVwIDMKKwkJCQkgKiBmb3IgcGFyYWxsZWxpemVkIHVwZGF0ZSBvZiBFTFAoeikgYW5kIEQoeikKKwkJCQkgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogVXBkYXRlIG9mIEVMUCh6KSBvbmx5IC0+IHN0YXkgaW4gU3RlcCAyICovCisJCQkJZ2FtbWFzW2xvb3BdID0gbmV4dF9nYW1tYTsKKwkJCQlpZiAobG9vcCA9PSAoaXRlcmF0aW9uICsgMSkpIHsKKwkJCQkJLyogdG8gc3RlcCA0ICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLyogU3RlcCAzCisJCQkgKiBBbHdheXMgaW50ZXJsZWF2ZWQgd2l0aCBTdGVwIDIgKGNhc2Ugd2hlbiBMPChuLWspKQorCQkJICogVXBkYXRlIG9mIERbbi0xXSh6KSA9IEVMUFtuLTFdKHopL2QKKwkJCSAqLworCQkJRFtsb29wXSA9IG1weV9tb2RfZ2YoZ2FtbWFzW2xvb3BdLCBpbnZkKTsKKwkJCS8qcHJpbnRrKEtFUk5fSU5GTyAiJTAyZC4gcz0zIExMPSV4IHBvbHkgJXhcbiIsCisJCQkgIGxvb3AsIExMLCBEW2xvb3BdKTsqLworCisJCQkvKiBDYW4gc2FmZWx5IHVwZGF0ZSBFTFBbbl0oeikgKi8KKwkJCWdhbW1hc1tsb29wXSA9IG5leHRfZ2FtbWE7CisKKwkJCWlmIChsb29wID09IChpdGVyYXRpb24gKyAxKSkgeworCQkJCS8qIElmIHVwZGF0ZSBmaW5pc2hlZCAqLworCQkJCUxMID0gaXRlcmF0aW9uIC0gTEwgKyAxOworCQkJCS8qIHRvIHN0ZXAgNCAqLworCQkJCWJyZWFrOworCQkJfQorCQkJLyogRWxzZSwgaW50ZXJsZWF2aW5nIHRvIHN0ZXAgMiovCisJCX0KKworCQkvKiBTdGVwIDQ6IFVwZGF0ZSBEKHopOiBpOjAtPkwgKi8KKwkJLyogRmluYWwgdXBkYXRlIG9mIERbbl0oeikgPSBEW25dKHopLnoqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTU7IGxvb3ArKykgLyogTGVmdCBTaGlmdCAqLworCQkJRFsxNSAtIGxvb3BdID0gRFsxNCAtIGxvb3BdOworCisJCURbMF0gPSAwOworCisJCWl0ZXJhdGlvbisrOworCX0gLyogd2hpbGUgKi8KKworCS8qIFByb2Nlc3NpbmcgZmluaXNoZWQsIGNvcHkgRUxQIHRvIGZpbmFsIHJlZ2lzdGVycyA6IDAtPjJ0LTEqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVycltsb29wXSA9IGdhbW1hc1tsb29wKzFdOworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBFcnIgcG9seToiKTsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQlwcmludGsoS0VSTl9JTkZPICIweCV4ICIsIGVycltsb29wXSk7CisJKi8KKwlyZXR1cm4gTEw7Cit9CisKKy8qCisgKiBzeW5kcm9tZSAtIEdlbmVyYXRlIHN5bmRyb21lIGNvbXBvbmVudHMgZnJvbSBodyBnZW5lcmF0ZSBzeW5kcm9tZQorICogcih4KSA9IGMoeCkgKyBlKHgpCisgKiBzKHgpID0gYyh4KSBtb2QgZyh4KSArIGUoeCkgbW9kIGcoeCkgPSAgZSh4KSBtb2QgZyh4KQorICogc28gcmVjZWl2ZXIgY2hlY2tzIGlmIHRoZSBzeW5kcm9tZSBzKHgpID0gcih4KSBtb2QgZyh4KSBpcyBlcXVhbCB0byB6ZXJvLgorICogdW5zaWduZWQgaW50IHNbMTZdOyAtIFN5bmRyb21lcworICovCitzdGF0aWMgdm9pZCBzeW5kcm9tZSh1bnNpZ25lZCBpbnQgc2VsZWN0XzRfOCwKKwkJCQkJdW5zaWduZWQgY2hhciAqZWNjLCB1bnNpZ25lZCBpbnQgc3luW10pCit7CisJdW5zaWduZWQgaW50IGssIGwsIHQ7CisJdW5zaWduZWQgaW50IGFscGhhX2JpdCwgUl9iaXQ7CisJaW50IGVjY19wb3MsIGVjY19taW47CisKKwkvKiAydC0xID0gMTUgKGZvciB0PTgpIG1pbmltYWwgcG9seW5vbWlhbHMgb2YgdGhlIGZpcnN0IDE1IHBvd2VycyBvZiBhCisJICogcHJpbWl0aXZlIGVsZW1tYW50cyBvZiBHRihtKTsgRXZlbiBwb3dlcnMgbWluaW1hbCBwb2x5bm9taWFscyBhcmUKKwkgKiBkdXBsaWNhdGUgb2Ygb2RkIHBvd2VycycgbWluaW1hbCBwb2x5bm9taWFscy4KKwkgKiBPZGQgcG93ZXJzIG9mIGFscGhhICgxIHRvIDE1KQorCSAqLworCXVuc2lnbmVkIGludCBwb3dfYWxwaGFbOF0gPSB7MHgwMDAyLCAweDAwMDgsIDB4MDAyMCwgMHgwMDgwLAorCQkJCSAweDAyMDAsIDB4MDgwMCwgMHgwMDFCLCAweDAwNkN9OworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBFQ0NbMC4ubl06ICIpOworCWZvciAoayA9IDA7IGsgPCAxMzsgaysrKQorCQlwcmludGsoS0VSTl9JTkZPICIweCV4ICIsIGVjY1trXSk7CisJKi8KKworCWlmIChzZWxlY3RfNF84ID09IDApIHsKKwkJdCA9IDQ7CisJCWVjY19wb3MgPSA1NTsgLyogYml0cyg1Mi1iaXRzKTogNTUtPjQgKi8KKwkJZWNjX21pbiA9IDQ7CisJfSBlbHNlIHsKKwkJdCA9IDg7CisJCWVjY19wb3MgPSAxMDM7IC8qIGJpdHM6IDEwMy0+MCAqLworCQllY2NfbWluID0gMDsKKwl9CisKKwkvKiB0b3RhbCBudW1iYmVyIG9mIHN5bmRyb20gdG8gYmUgdXNlZCBpcyAydCAqLworCS8qIFN0ZXAxOiBjYWxjdWxhdGUgdGhlIG9kZCBzeW5kcm9tZShzKSAqLworCVJfYml0ID0gKChlY2NbZWNjX3Bvcy84XSA+PiAoNyAtIGVjY19wb3MlOCkpICYgMSk7CisJZWNjX3Bvcy0tOworCWZvciAoayA9IDA7IGsgPCB0OyBrKyspCisJCXN5blsyICoga10gPSBSX2JpdDsKKworCXdoaWxlIChlY2NfcG9zID49IGVjY19taW4pIHsKKwkJUl9iaXQgPSAoKGVjY1tlY2NfcG9zLzhdID4+ICg3IC0gZWNjX3BvcyU4KSkgJiAxKTsKKwkJZWNjX3Bvcy0tOworCisJCWZvciAoayA9IDA7IGsgPCB0OyBrKyspIHsKKwkJCS8qIEFjY3VtdWxhdGUgdmFsdWUgb2YgeF5pIGF0IGFscGhhXigyaysxKSAqLworCQkJaWYgKFJfYml0ID09IDEpCisJCQkJc3luWzIqa10gXj0gcG93X2FscGhhW2tdOworCisJCQkvKiBDb21wdXRlIGEqKigyaysxKSwgdXNpbmcgTFNGUiAqLworCQkJZm9yIChsID0gMDsgbCA8ICgyICogayArIDEpOyBsKyspIHsKKwkJCQlhbHBoYV9iaXQgPSAocG93X2FscGhhW2tdID4+IFBPTFkpICYgMTsKKwkJCQlwb3dfYWxwaGFba10gPSAocG93X2FscGhhW2tdIDw8IDEpICYgMHgxRkZGOworCQkJCWlmIChhbHBoYV9iaXQgPT0gMSkKKwkJCQkJcG93X2FscGhhW2tdIF49IFA7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdGVwMjogY2FsY3VsYXRlIHRoZSBldmVuIHN5bmRyb21lKHMpCisJICogQ29tcHV0ZSBTKGEpLCB3aGVyZSBhIGlzIGFuIGV2ZW4gcG93ZXIgb2YgYWxwaGEKKwkgKiBFdmVucnkgZXZlbiBwb3dlciBvZiBwcmltaXRpdmUgZWxlbWVudCBoYXMgdGhlIHNhbWUgbWluaW1hbAorCSAqIHBvbHlub21pYWwgYXMgc29tZSBvZGQgcG93ZXIgb2YgZWxlbWV0cy4KKwkgKiBBbmQgYmFzZWQgb24gUyhhXjIpID0gU14yKGEpCisJICovCisJZm9yIChrID0gMDsgayA8IHQ7IGsrKykKKwkJc3luWzIqaysxXSA9IG1weV9tb2RfZ2Yoc3luW2tdLCBzeW5ba10pOworCisJLypwcmludGsoS0VSTl9JTkZPICJcbiBTeW5kcm9tZXM6ICIpOworCWZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorCXByaW50ayhLRVJOX0lORk8gIjB4JXggIiwgc3luW2tdKTsqLworfQorCisvKioKKyAqIGRlY29kZV9iY2ggLSBCQ0ggZGVjb2RlciBmb3IgNC0gYW5kIDgtYml0IGVycm9yIGNvcnJlY3Rpb24KKyAqCisgKiBAZWNjIC0gRUNDIHN5bmRyb21lIGdlbmVyYXRlZCBieSBodyBCQ0ggZW5naW5lCisgKiBAZXJyX2xvYyAtIHBvaW50ZXIgdG8gZXJyb3IgbG9jYXRpb24gYXJyYXkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgcG9zdCBzeWRyb21lIGdlbmVyYXRpb24gKGh3IGdlbmVyYXRlZCkgZGVjb2RpbmcKKyAqIGZvcjotCisgKiBEaW1lbnNpb24gb2YgR2Fsb2lzZSBGaWVsZDogbSA9IDEzCisgKiBMZW5ndGggb2YgY29kZXdvcmQ6IG4gPSAyKiptIC0gMQorICogTnVtYmVyIG9mIGVycm9ycyB0aGF0IGNhbiBiZSBjb3JyZWN0ZWQ6IDQtIG9yIDgtYml0cworICogTGVuZ3RoIG9mIGluZm9ybWF0aW9uIGJpdDoga2sgPSBubiAtIHJyCisgKi8KK2ludCBkZWNvZGVfYmNoKGludCBzZWxlY3RfNF84LCB1bnNpZ25lZCBjaGFyICplY2MsIHVuc2lnbmVkIGludCAqZXJyX2xvYykKK3sKKyAgICAgICAgaW50IG5vX29mX2VyciwgaTsKKwl1bnNpZ25lZCBpbnQgc3luWzE2XTsJLyogMTYgU3luZHJvbWVzICovCisJdW5zaWduZWQgaW50IGVycl9wb2x5WzhdOworCS8qIENvZWZmaWNpZW50cyB0byB0aGUgZXJyb3IgcG9seW5vbWlhbAorCSAqIEVMUCh4KSA9IDEgKyBlcnIwLnggKyBlcnIxLnheMiArIC4uLiArIGVycjcueF44CisJICovCisKKwkvKiBwZXJmb3JtIG1hbnVhbCBpbml0aWFsaXphdGlvbiB0byBhdm9pZCBtZW1zZXQgKi8KKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJICBzeW5baV0gPSAwOworCSAgaWYgKGk8OCkKKwkgICAgZXJyX3BvbHlbaV0gPSAwOworCX0KKworCS8qIERlY290aW5nIGludm9sZXMgdGhyZWUgc3RlcHMKKwkgKiAxLiBDb21wdXRlIHRoZSBzeW5kcm9tIGZyb20gdGVoIHJlY2VpdmVkIGNvZGV3b3JkLAorCSAqIDIuIEZpbmQgdGhlIGVycm9yIGxvY2F0aW9uIHBvbHlub21pYWwgZnJvbSBhIHNldCBvZiBlcXVhdGlvbnMKKwkgKiAgICAgZGVyaXZlZCBmcm9tIHRoZSBzeW5kcm9tZSwKKwkgKiAzLiBVc2UgdGhlIGVycm9yIGxvY2F0aW9uIHBvbHlub21pYWwgdG8gaWRlbnRpZnkgZXJyYW50cyBiaXRzLAorCSAqCisJICogQW5kIGNvcnJlY3R0aW9uIGRvbmUgYnkgYml0IGZsaXBzIHVzaW5nIGVycm9yIGxvY2FpdG9uIGFuZCBleHBlY3RlZAorCSAqIHRvIGJlIG91dHNlaWRlIG9mIHRoaXMgaW1wbGVtZW50YXRpb24uCisJICovCisJc3luZHJvbWUoc2VsZWN0XzRfOCwgZWNjLCBzeW4pOworCW5vX29mX2VyciA9IGJlcmxla2FtcChzZWxlY3RfNF84LCBzeW4sIGVycl9wb2x5KTsKKwlpZiAobm9fb2ZfZXJyIDw9ICg0IDw8IHNlbGVjdF80XzgpKQorCQlub19vZl9lcnIgPSBjaGllbihzZWxlY3RfNF84LCBub19vZl9lcnIsIGVycl9wb2x5LCBlcnJfbG9jKTsKKworCXJldHVybiBub19vZl9lcnI7Cit9CitFWFBPUlRfU1lNQk9MKGRlY29kZV9iY2gpOwpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvbGliL3ByaW50Zi5jIGIveC1sb2FkZXIvbGliL3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDIyZmMKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9saWIvcHJpbnRmLmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyAqCisgKiBCYXNlZCBvbiB0aGUgZm9sbG93aW5nIGZpbGU6CisgKiAgbGludXgvbGliL3ZzcHJpbnRmLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qIHZzcHJpbnRmLmMgLS0gTGFycyBXaXJ6ZW5pdXMgJiBMaW51cyBUb3J2YWxkcy4gKi8KKy8qCisgKiBXaXJ6ZW5pdXMgd3JvdGUgdGhpcyBwb3J0YWJseSwgVG9ydmFsZHMgZnVja2VkIGl0IHVwIDotKQorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjb21tb24uaD4KKworI2lmZGVmIENGR19QUklOVEYKKyAKKy8qIHdlIHVzZSB0aGlzIHNvIHRoYXQgd2UgY2FuIGRvIHdpdGhvdXQgdGhlIGN0eXBlIGxpYnJhcnkgKi8KKyNkZWZpbmUgaXNfZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKKworc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqIHMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiBzYyAtIHM7Cit9CisKK3N0YXRpYyBpbnQgc2tpcF9hdG9pKGNvbnN0IGNoYXIgKipzKQoreworCWludCBpPTA7CisKKwl3aGlsZSAoaXNfZGlnaXQoKipzKSkKKwkJaSA9IGkqMTAgKyAqKCgqcykrKykgLSAnMCc7CisJcmV0dXJuIGk7Cit9CisKKyNkZWZpbmUgWkVST1BBRAkxCQkvKiBwYWQgd2l0aCB6ZXJvICovCisjZGVmaW5lIFNJR04JMgkJLyogdW5zaWduZWQvc2lnbmVkIGxvbmcgKi8KKyNkZWZpbmUgUExVUwk0CQkvKiBzaG93IHBsdXMgKi8KKyNkZWZpbmUgU1BBQ0UJOAkJLyogc3BhY2UgaWYgcGx1cyAqLworI2RlZmluZSBMRUZUCTE2CQkvKiBsZWZ0IGp1c3RpZmllZCAqLworI2RlZmluZSBTUEVDSUFMCTMyCQkvKiAweCAqLworI2RlZmluZSBMQVJHRQk2NAkJLyogdXNlICdBQkNERUYnIGluc3RlYWQgb2YgJ2FiY2RlZicgKi8KKworI2RlZmluZSBkb19kaXYobixiYXNlKSAoeyBcCitpbnQgX19yZXM7IFwKK19fcmVzID0gKCh1bnNpZ25lZCBsb25nKSBuKSAlICh1bnNpZ25lZCkgYmFzZTsgXAorbiA9ICgodW5zaWduZWQgbG9uZykgbikgLyAodW5zaWduZWQpIGJhc2U7IFwKK19fcmVzOyB9KQorCitzdGF0aWMgY2hhciAqIG51bWJlcihjaGFyICogc3RyLCBsb25nIG51bSwgaW50IGJhc2UsIGludCBzaXplLCBpbnQgcHJlY2lzaW9uCisJLGludCB0eXBlKQoreworCWNoYXIgYyxzaWduLHRtcFs2Nl07CisJY29uc3QgY2hhciAqZGlnaXRzPSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCWludCBpOworCisJaWYgKHR5cGUgJiBMQVJHRSkKKwkJZGlnaXRzID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiI7CisJaWYgKHR5cGUgJiBMRUZUKQorCQl0eXBlICY9IH5aRVJPUEFEOworCWlmIChiYXNlIDwgMiB8fCBiYXNlID4gMzYpCisJCXJldHVybiAwOworCWMgPSAodHlwZSAmIFpFUk9QQUQpID8gJzAnIDogJyAnOworCXNpZ24gPSAwOworCWlmICh0eXBlICYgU0lHTikgeworCQlpZiAobnVtIDwgMCkgeworCQkJc2lnbiA9ICctJzsKKwkJCW51bSA9IC1udW07CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFBMVVMpIHsKKwkJCXNpZ24gPSAnKyc7CisJCQlzaXplLS07CisJCX0gZWxzZSBpZiAodHlwZSAmIFNQQUNFKSB7CisJCQlzaWduID0gJyAnOworCQkJc2l6ZS0tOworCQl9CisJfQorCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCQlpZiAoYmFzZSA9PSAxNikKKwkJCXNpemUgLT0gMjsKKwkJZWxzZSBpZiAoYmFzZSA9PSA4KQorCQkJc2l6ZS0tOworCX0KKwlpID0gMDsKKwlpZiAobnVtID09IDApCisJCXRtcFtpKytdPScwJzsKKwllbHNlIHdoaWxlIChudW0gIT0gMCkKKwkJdG1wW2krK10gPSBkaWdpdHNbZG9fZGl2KG51bSxiYXNlKV07CisJaWYgKGkgPiBwcmVjaXNpb24pCisJCXByZWNpc2lvbiA9IGk7CisJc2l6ZSAtPSBwcmVjaXNpb247CisJaWYgKCEodHlwZSYoWkVST1BBRCtMRUZUKSkpCisJCXdoaWxlKHNpemUtLT4wKQorCQkJKnN0cisrID0gJyAnOworCWlmIChzaWduKQorCQkqc3RyKysgPSBzaWduOworCWlmICh0eXBlICYgU1BFQ0lBTCkgeworCQlpZiAoYmFzZT09OCkKKwkJCSpzdHIrKyA9ICcwJzsKKwkJZWxzZSBpZiAoYmFzZT09MTYpIHsKKwkJCSpzdHIrKyA9ICcwJzsKKwkJCSpzdHIrKyA9IGRpZ2l0c1szM107CisJCX0KKwl9CisJaWYgKCEodHlwZSAmIExFRlQpKQorCQl3aGlsZSAoc2l6ZS0tID4gMCkKKwkJCSpzdHIrKyA9IGM7CisJd2hpbGUgKGkgPCBwcmVjaXNpb24tLSkKKwkJKnN0cisrID0gJzAnOworCXdoaWxlIChpLS0gPiAwKQorCQkqc3RyKysgPSB0bXBbaV07CisJd2hpbGUgKHNpemUtLSA+IDApCisJCSpzdHIrKyA9ICcgJzsKKwlyZXR1cm4gc3RyOworfQorCisgCitzdGF0aWMgaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBsb25nIG51bTsKKwlpbnQgaSwgYmFzZTsKKwljaGFyICogc3RyOworCWNvbnN0IGNoYXIgKnM7CisKKwlpbnQgZmxhZ3M7CQkvKiBmbGFncyB0byBudW1iZXIoKSAqLworCisJaW50IGZpZWxkX3dpZHRoOwkvKiB3aWR0aCBvZiBvdXRwdXQgZmllbGQgKi8KKwlpbnQgcHJlY2lzaW9uOwkJLyogbWluLiAjIG9mIGRpZ2l0cyBmb3IgaW50ZWdlcnM7IG1heAorCQkJCSAgIG51bWJlciBvZiBjaGFycyBmb3IgZnJvbSBzdHJpbmcgKi8KKwlpbnQgcXVhbGlmaWVyOwkJLyogJ2gnLCAnbCcsIG9yICdMJyBmb3IgaW50ZWdlciBmaWVsZHMgKi8KKworCWZvciAoc3RyPWJ1ZiA7ICpmbXQgOyArK2ZtdCkgeworCQlpZiAoKmZtdCAhPSAnJScpIHsKKwkJCSpzdHIrKyA9ICpmbXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHByb2Nlc3MgZmxhZ3MgKi8KKwkJZmxhZ3MgPSAwOworCQlyZXBlYXQ6CisJCQkrK2ZtdDsJCS8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KKwkJCXN3aXRjaCAoKmZtdCkgeworCQkJCWNhc2UgJy0nOiBmbGFncyB8PSBMRUZUOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcrJzogZmxhZ3MgfD0gUExVUzsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnICc6IGZsYWdzIHw9IFNQQUNFOyBnb3RvIHJlcGVhdDsKKwkJCQljYXNlICcjJzogZmxhZ3MgfD0gU1BFQ0lBTDsgZ290byByZXBlYXQ7CisJCQkJY2FzZSAnMCc6IGZsYWdzIHw9IFpFUk9QQUQ7IGdvdG8gcmVwZWF0OworCQkJCX0KKworCQkvKiBnZXQgZmllbGQgd2lkdGggKi8KKwkJZmllbGRfd2lkdGggPSAtMTsKKwkJaWYgKGlzX2RpZ2l0KCpmbXQpKQorCQkJZmllbGRfd2lkdGggPSBza2lwX2F0b2koJmZtdCk7CisJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkrK2ZtdDsKKwkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCWZpZWxkX3dpZHRoID0gdmFfYXJnKGFyZ3MsIGludCk7CisJCQlpZiAoZmllbGRfd2lkdGggPCAwKSB7CisJCQkJZmllbGRfd2lkdGggPSAtZmllbGRfd2lkdGg7CisJCQkJZmxhZ3MgfD0gTEVGVDsKKwkJCX0KKwkJfQorCisJCS8qIGdldCB0aGUgcHJlY2lzaW9uICovCisJCXByZWNpc2lvbiA9IC0xOworCQlpZiAoKmZtdCA9PSAnLicpIHsKKwkJCSsrZm10OworCQkJaWYgKGlzX2RpZ2l0KCpmbXQpKQorCQkJCXByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKKwkJCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCQkJKytmbXQ7CisJCQkJLyogaXQncyB0aGUgbmV4dCBhcmd1bWVudCAqLworCQkJCXByZWNpc2lvbiA9IHZhX2FyZyhhcmdzLCBpbnQpOworCQkJfQorCQkJaWYgKHByZWNpc2lvbiA8IDApCisJCQkJcHJlY2lzaW9uID0gMDsKKwkJfQorCisJCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KKwkJcXVhbGlmaWVyID0gLTE7CisJCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJykgeworCQkJcXVhbGlmaWVyID0gKmZtdDsKKwkJCSsrZm10OworCQl9CisKKwkJLyogZGVmYXVsdCBiYXNlICovCisJCWJhc2UgPSAxMDsKKworCQlzd2l0Y2ggKCpmbXQpIHsKKwkJY2FzZSAnYyc6CisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkKKwkJCQkJKnN0cisrID0gJyAnOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3MnOgorCQkJcyA9IHZhX2FyZyhhcmdzLCBjaGFyICopOworCQkJaWYgKCFzKQorCQkJCXMgPSAiPE5VTEw+IjsKKworCQkJbGVuID0gc3RybmxlbihzLCBwcmVjaXNpb24pOworCisJCQlpZiAoIShmbGFncyAmIExFRlQpKQorCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCQkqc3RyKysgPSAnICc7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisJCQkJKnN0cisrID0gKnMrKzsKKwkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKQorCQkJCSpzdHIrKyA9ICcgJzsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJ3AnOgorCQkJaWYgKGZpZWxkX3dpZHRoID09IC0xKSB7CisJCQkJZmllbGRfd2lkdGggPSAyKnNpemVvZih2b2lkICopOworCQkJCWZsYWdzIHw9IFpFUk9QQUQ7CisJCQl9CisJCQlzdHIgPSBudW1iZXIoc3RyLAorCQkJCSh1bnNpZ25lZCBsb25nKSB2YV9hcmcoYXJncywgdm9pZCAqKSwgMTYsCisJCQkJZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCQkJY29udGludWU7CisKKworCQljYXNlICduJzoKKwkJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQkJbG9uZyAqIGlwID0gdmFfYXJnKGFyZ3MsIGxvbmcgKik7CisJCQkJKmlwID0gKHN0ciAtIGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCWludCAqIGlwID0gdmFfYXJnKGFyZ3MsIGludCAqKTsKKwkJCQkqaXAgPSAoc3RyIC0gYnVmKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCWNhc2UgJyUnOgorCQkJKnN0cisrID0gJyUnOworCQkJY29udGludWU7CisKKwkJLyogaW50ZWdlciBudW1iZXIgZm9ybWF0cyAtIHNldCB1cCB0aGUgZmxhZ3MgYW5kICJicmVhayIgKi8KKwkJY2FzZSAnbyc6CisJCQliYXNlID0gODsKKwkJCWJyZWFrOworCisJCWNhc2UgJ1gnOgorCQkJZmxhZ3MgfD0gTEFSR0U7CisJCWNhc2UgJ3gnOgorCQkJYmFzZSA9IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2knOgorCQkJZmxhZ3MgfD0gU0lHTjsKKwkJY2FzZSAndSc6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJKnN0cisrID0gJyUnOworCQkJaWYgKCpmbXQpCisJCQkJKnN0cisrID0gKmZtdDsKKwkJCWVsc2UKKwkJCQktLWZtdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChxdWFsaWZpZXIgPT0gJ2wnKQorCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworCQllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CisJCQludW0gPSAodW5zaWduZWQgc2hvcnQpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJaWYgKGZsYWdzICYgU0lHTikKKwkJCQludW0gPSAoc2hvcnQpIG51bTsKKwkJfSBlbHNlIGlmIChmbGFncyAmIFNJR04pCisJCQludW0gPSB2YV9hcmcoYXJncywgaW50KTsKKwkJZWxzZQorCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCXN0ciA9IG51bWJlcihzdHIsIG51bSwgYmFzZSwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOworCX0KKwkqc3RyID0gJ1wwJzsKKwlyZXR1cm4gc3RyLWJ1ZjsKK30KKwordm9pZCBzZXJpYWxfcHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdWludCBpOworCWNoYXIgcHJpbnRidWZmZXJbQ0ZHX1BCU0laRV07CisKKwl2YV9zdGFydCAoYXJncywgZm10KTsKKworCS8qIEZvciB0aGlzIHRvIHdvcmssIHByaW50YnVmZmVyIG11c3QgYmUgbGFyZ2VyIHRoYW4KKwkgKiBhbnl0aGluZyB3ZSBldmVyIHdhbnQgdG8gcHJpbnQuCisJICovCisJaSA9IHZzcHJpbnRmIChwcmludGJ1ZmZlciwgZm10LCBhcmdzKTsKKwl2YV9lbmQgKGFyZ3MpOworCisJLyogUHJpbnQgdGhlIHN0cmluZyAqLworCXNlcmlhbF9wdXRzIChwcmludGJ1ZmZlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL2xpYi9zdHJpbmcuYyBiL3gtbG9hZGVyL2xpYi9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ4Njc1Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvbGliL3N0cmluZy5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgbGludXgvbGliL3N0cmluZy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisvKgorICogc3R1cGlkIGxpYnJhcnkgcm91dGluZXMuLiBUaGUgb3B0aW1pemVkIHZlcnNpb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgZm91bmQKKyAqIGFzIGlubGluZSBjb2RlIGluIDxhc20teHgvc3RyaW5nLmg+CisgKgorICogVGhlc2UgYXJlIGJ1Z2d5IGFzIHdlbGwuLgorICoKKyAqICogRnJpIEp1biAyNSAxOTk5LCBJbmdvIE9lc2VyIDxpb2VAaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZT4KKyAqIC0gIEFkZGVkIHN0cnNlcCgpIHdoaWNoIHdpbGwgcmVwbGFjZSBzdHJ0b2soKSBzb29uIChiZWNhdXNlIHN0cnNlcCgpIGlzCisgKiAgICByZWVudHJhbnQgYW5kIHNob3VsZCBiZSBmYXN0ZXIpLiBVc2Ugb25seSBzdHJzZXAoKSBpbiBuZXcgY29kZSwgcGxlYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1NT1ZFCisvKioKKyAqIG1lbW1vdmUgLSBDb3B5IG9uZSBhcmVhIG9mIG1lbW9yeSB0byBhbm90aGVyCisgKiBAZGVzdDogV2hlcmUgdG8gY29weSB0bworICogQHNyYzogV2hlcmUgdG8gY29weSBmcm9tCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIFVubGlrZSBtZW1jcHkoKSwgbWVtbW92ZSgpIGNvcGVzIHdpdGggb3ZlcmxhcHBpbmcgYXJlYXMuCisgKi8KK3ZvaWQgKiBtZW1tb3ZlKHZvaWQgKiBkZXN0LGNvbnN0IHZvaWQgKnNyYyxzaXplX3QgY291bnQpCit7CisJY2hhciAqdG1wLCAqczsKKworCWlmIChkZXN0IDw9IHNyYykgeworCQl0bXAgPSAoY2hhciAqKSBkZXN0OworCQlzID0gKGNoYXIgKikgc3JjOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSp0bXArKyA9ICpzKys7CisJCX0KKwllbHNlIHsKKwkJdG1wID0gKGNoYXIgKikgZGVzdCArIGNvdW50OworCQlzID0gKGNoYXIgKikgc3JjICsgY291bnQ7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKi0tdG1wID0gKi0tczsKKwkJfQorCisJcmV0dXJuIGRlc3Q7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL21rY29uZmlnIGIveC1sb2FkZXIvbWtjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE1YTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL21rY29uZmlnCkBAIC0wLDAgKzEsMTM4IEBACisjIS9iaW4vc2ggLWUKKworIyBTY3JpcHQgdG8gY3JlYXRlIGhlYWRlciBmaWxlcyBhbmQgbGlua3MgdG8gY29uZmlndXJlCisjIFgtTG9hZGVyIGZvciBhIHNwZWNpZmljIGJvYXJkLgorIworIyBQYXJhbWV0ZXJzOiAgVGFyZ2V0ICBBcmNoaXRlY3R1cmUgIENQVSAgQm9hcmQgW1ZFTkRPUl0gW1NPQ10KKyMKKyMgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMKKyMgKEMpIDIwMDItMjAwNiBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBXb2xmZ2FuZyBEZW5rIDx3ZEBkZW54LmRlPgorIworCitBUFBFTkQ9bm8JIyBEZWZhdWx0OiBDcmVhdGUgbmV3IGNvbmZpZyBmaWxlCitCT0FSRF9OQU1FPSIiCSMgTmFtZSB0byBwcmludCBpbiBtYWtlIG91dHB1dAorVEFSR0VUUz0iIgorCithcmNoPSIiCitjcHU9IiIKK2JvYXJkPSIiCit2ZW5kb3I9IiIKK3NvYz0iIgorCitpZiBbIFwoICQjIC1lcSAyIFwpIC1hIFwoICIkMSIgPSAiLUEiIFwpIF0gOyB0aGVuCisJIyBBdXRvbWF0aWMgbW9kZQorCWxpbmU9YGVncmVwIC1pICJeW1s6c3BhY2U6XV0qJHsyfVtbOnNwYWNlOl1dIiBib2FyZHMuY2ZnYCB8fCB7CisJCWVjaG8gIm1ha2U6ICoqKiBObyBydWxlIHRvIG1ha2UgdGFyZ2V0IFxgJDJfY29uZmlnJy4gIFN0b3AuIiA+JjIKKwkJZXhpdCAxCisJfQorCisJc2V0ICR7bGluZX0KKwkjIGFkZCBkZWZhdWx0IGJvYXJkIG5hbWUgaWYgbmVlZGVkCisJWyAkIyA9IDMgXSAmJiBzZXQgJHtsaW5lfSAkezF9CitmaQorCit3aGlsZSBbICQjIC1ndCAwIF0gOyBkbworCWNhc2UgIiQxIiBpbgorCS0tKSBzaGlmdCA7IGJyZWFrIDs7CisJLWEpIHNoaWZ0IDsgQVBQRU5EPXllcyA7OworCS1uKSBzaGlmdCA7IEJPQVJEX05BTUU9IiR7MSVfY29uZmlnfSIgOyBzaGlmdCA7OworCS10KSBzaGlmdCA7IFRBUkdFVFM9ImBlY2hvICQxIHwgc2VkICdzOl86IDpnJ2AgJHtUQVJHRVRTfSIgOyBzaGlmdCA7OworCSopICBicmVhayA7OworCWVzYWMKK2RvbmUKKworWyAkIyAtbHQgNCBdICYmIGV4aXQgMQorWyAkIyAtZ3QgNiBdICYmIGV4aXQgMQorCitDT05GSUdfTkFNRT0iJHsxJV9jb25maWd9IgorCitbICIke0JPQVJEX05BTUV9IiBdIHx8IEJPQVJEX05BTUU9IiR7Q09ORklHX05BTUV9IgorCithcmNoPSIkMiIKK2NwdT0iJDMiCitpZiBbICIkNCIgPSAiLSIgXSA7IHRoZW4KKwlib2FyZD0ke0JPQVJEX05BTUV9CitlbHNlCisJYm9hcmQ9IiQ0IgorZmkKK1sgJCMgLWd0IDQgXSAmJiBbICIkNSIgIT0gIi0iIF0gJiYgdmVuZG9yPSIkNSIKK1sgJCMgLWd0IDUgXSAmJiBbICIkNiIgIT0gIi0iIF0gJiYgc29jPSIkNiIKKworaWYgWyAiJHtBUkNIfSIgLWEgIiR7QVJDSH0iICE9ICIke2FyY2h9IiBdOyB0aGVuCisJZWNobyAiRmFpbGVkOiBcJEFSQ0g9JHtBUkNIfSwgc2hvdWxkIGJlICcke2FyY2h9JyBmb3IgJHtCT0FSRF9OQU1FfSIgMT4mMgorCWV4aXQgMQorZmkKKworZWNobyAiQ29uZmlndXJpbmcgZm9yICR7Qk9BUkRfTkFNRX0gYm9hcmQuLi4iCisKKyMKKyMgQ3JlYXRlIGxpbmsgdG8gYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGhlYWRlcnMKKyMKK2lmIFsgIiRTUkNUUkVFIiAhPSAiJE9CSlRSRUUiIF0gOyB0aGVuCisJbWtkaXIgLXAgJHtPQkpUUkVFfS9pbmNsdWRlCisJbWtkaXIgLXAgJHtPQkpUUkVFfS9pbmNsdWRlMgorCWNkICR7T0JKVFJFRX0vaW5jbHVkZTIKKwlybSAtZiBhc20KKwlsbiAtcyAke1NSQ1RSRUV9L2luY2x1ZGUvYXNtIGFzbQorCUxOUFJFRklYPSR7U1JDVFJFRX0vaW5jbHVkZS9hc20vCisJY2QgLi4vaW5jbHVkZQorCXJtIC1mIGFzbQorCWxuIC1zICR7U1JDVFJFRX0vaW5jbHVkZS9hc20gYXNtCitlbHNlCisJY2QgLi9pbmNsdWRlCitmaQorCitybSAtZiBhc20vYXJjaAorCitpZiBbIC16ICIke3NvY30iIF0gOyB0aGVuCisJbG4gLXMgJHtMTlBSRUZJWH1hcmNoLSR7Y3B1fSBhc20vYXJjaAorZWxzZQorCWxuIC1zICR7TE5QUkVGSVh9YXJjaC0ke3NvY30gYXNtL2FyY2gKK2ZpCisKK2lmIFsgIiR7YXJjaH0iID0gImFybSIgXSA7IHRoZW4KKwlybSAtZiBhc20vcHJvYworCWxuIC1zICR7TE5QUkVGSVh9cHJvYy1hcm12IGFzbS9wcm9jCitmaQorCisjCisjIENyZWF0ZSBpbmNsdWRlIGZpbGUgZm9yIE1ha2UKKyMKK2VjaG8gIkFSQ0ggICA9ICR7YXJjaH0iICA+ICBjb25maWcubWsKK2VjaG8gIkNQVSAgICA9ICR7Y3B1fSIgICA+PiBjb25maWcubWsKK2VjaG8gIkJPQVJEICA9ICR7Ym9hcmR9IiA+PiBjb25maWcubWsKKworWyAiJHt2ZW5kb3J9IiBdICYmIGVjaG8gIlZFTkRPUiA9ICR7dmVuZG9yfSIgPj4gY29uZmlnLm1rCisKK1sgIiR7c29jfSIgICAgXSAmJiBlY2hvICJTT0MgICAgPSAke3NvY30iICAgID4+IGNvbmZpZy5taworCisjIEFzc2lnbiBib2FyZCBkaXJlY3RvcnkgdG8gQk9BUkRJUiB2YXJpYWJsZQoraWYgWyAteiAiJHt2ZW5kb3J9IiBdIDsgdGhlbgorICAgIEJPQVJERElSPSR7Ym9hcmR9CitlbHNlCisgICAgQk9BUkRESVI9JHt2ZW5kb3J9LyR7Ym9hcmR9CitmaQorCisjCisjIENyZWF0ZSBib2FyZCBzcGVjaWZpYyBoZWFkZXIgZmlsZQorIworaWYgWyAiJEFQUEVORCIgPSAieWVzIiBdCSMgQXBwZW5kIHRvIGV4aXN0aW5nIGNvbmZpZyBmaWxlCit0aGVuCisJZWNobyA+PiBjb25maWcuaAorZWxzZQorCT4gY29uZmlnLmgJCSMgQ3JlYXRlIG5ldyBjb25maWcgZmlsZQorZmkKK2VjaG8gIi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IGVkaXQgKi8iID4+Y29uZmlnLmgKKworZm9yIGkgaW4gJHtUQVJHRVRTfSA7IGRvCisJZWNobyAiI2RlZmluZSBDT05GSUdfTUtfJHtpfSAxIiA+PmNvbmZpZy5oIDsKK2RvbmUKKworY2F0IDw8IEVPRiA+PiBjb25maWcuaAorI2RlZmluZSBDT05GSUdfQk9BUkRESVIgYm9hcmQvJEJPQVJERElSCisjaW5jbHVkZSA8Y29uZmlnX2RlZmF1bHRzLmg+CisjaW5jbHVkZSA8Y29uZmlncy8ke0NPTkZJR19OQU1FfS5oPgorI2luY2x1ZGUgPGFzbS9jb25maWcuaD4KK0VPRgorCitleGl0IDAKZGlmZiAtLWdpdCBhL3gtbG9hZGVyL3J1bGVzLm1rIGIveC1sb2FkZXIvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2NzBhYwotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3J1bGVzLm1rCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworX2RlcGVuZDoJJChvYmopLmRlcGVuZAorCiskKG9iaikuZGVwZW5kOgkkKHNyYylNYWtlZmlsZSAkKFRPUERJUikvY29uZmlnLm1rICQoU1JDUykgJChIT1NUU1JDUykKKwkJQHJtIC1mICRACisJCUBmb3IgZiBpbiAkKFNSQ1MpOyBkbyBcCisJCQlnPWBiYXNlbmFtZSAkJGYgfCBzZWQgLWUgJ3MvXCguKlwpXC5cdy9cMS5vLydgOyBcCisJCQkkKENDKSAtTSAkKENQUEZMQUdTKSAtTVEgJChvYmopJCRnICQkZiA+PiAkQCA7IFwKKwkJZG9uZQorCQlAZm9yIGYgaW4gJChIT1NUU1JDUyk7IGRvIFwKKwkJCWc9YGJhc2VuYW1lICQkZiB8IHNlZCAtZSAncy9cKC4qXClcLlx3L1wxLm8vJ2A7IFwKKwkJCSQoSE9TVENDKSAtTSAkKEhPU1RDUFBGTEFHUykgLU1RICQob2JqKSQkZyAkJGYgPj4gJEAgOyBcCisJCWRvbmUKKworJChIT1NUT0JKUyk6ICQob2JqKSUubzogJS5jCisJJChIT1NUQ0MpICQoSE9TVENGTEFHUykgJChIT1NUQ0ZMQUdTXyQoQEYpKSAkKEhPU1RDRkxBR1NfJChCQ1VSRElSKSkgLW8gJEAgJDwgLWMKKyQoTk9QRURPQkpTKTogJChvYmopJS5vOiAlLmMKKwkkKEhPU1RDQykgJChIT1NUQ0ZMQUdTX05PUEVEKSAkKEhPU1RDRkxBR1NfJChARikpICQoSE9TVENGTEFHU18kKEJDVVJESVIpKSAtbyAkQCAkPCAtYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci9zY3JpcHRzL21rb25lYm9vdC5zaCBiL3gtbG9hZGVyL3NjcmlwdHMvbWtvbmVib290LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODYyYTUKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci9zY3JpcHRzL21rb25lYm9vdC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKKworSU1BR0UxPXgtbG9hZC5iaW4uaWZ0CitJTUFHRTI9eC1sb2FkLXNpZ25lZC5pZnQKK1RNUD1vbmVsb2FkZXIKK1BBR0VTSVpFPTIwNDgKKworc2l6ZT1gbHMgLWxhICRJTUFHRTEgfCBhd2sgLUYnICcgJ3sgcHJpbnRmICQ1fSdgCitsZXQgcmVtYWluPSRQQUdFU0laRS0kc2l6ZQorZGQgaWY9L2Rldi96ZXJvIG9mPSRJTUFHRTIgYnM9MSBjb3VudD01MTIKKyNkZCBpZj0vZGV2L3plcm8gb2Y9emVyb2ZpbGUgYnM9JHJlbWFpbiBjb3VudD0xID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbAorY2F0ICRJTUFHRTE+PiRJTUFHRTIKKworcm0gLWYgJElNQUdFMQorCitlY2hvICJDcmVhdGUgJElNQUdFMiBjb21wbGV0ZWQuLi4iCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9NYWtlZmlsZSBiL3gtbG9hZGVyL3Rvb2xzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDViMmIKLS0tIC9kZXYvbnVsbAorKysgYi94LWxvYWRlci90b29scy9NYWtlZmlsZQpAQCAtMCwwICsxLDg5IEBACisjCisjIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA2CisjIFdvbGZnYW5nIERlbmssIERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIHdkQGRlbnguZGUuCisjCisjIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisjIHByb2plY3QuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisjIE1BIDAyMTExLTEzMDcgVVNBCisjCisKK1RPT0xTVUJESVJTID0KKworIworIyB0b29sY2hhaW5zIHRhcmdldGluZyB3aW4zMiBnZW5lcmF0ZSAuZXhlIGZpbGVzCisjCitpZm5lcSAoLCQoZmluZHN0cmluZyBXSU4zMiAsJChzaGVsbCAkKEhPU1RDQykgLUUgLWRNIC14YyAvZGV2L251bGwpKSkKK1NGWCA9IC5leGUKK2Vsc2UKK1NGWCA9CitlbmRpZgorCisjCisjIEluY2x1ZGUgdGhpcyBhZnRlciBIT1NUT1MgSE9TVEFSQ0ggY2hlY2sKKyMgc28gdGhhdCB3ZSBjYW4gYWN0IGludGVsbGlnZW50bHkuCisjCitpbmNsdWRlICQoVE9QRElSKS9jb25maWcubWsKKworIyBHZW5lcmF0ZWQgZXhlY3V0YWJsZSBmaWxlcworQklOX0ZJTEVTLXkgKz0gc2lnbkdQJChTRlgpCitPQkpfRklMRVMteSArPSBzaWduR1AubworCisjIG5vdyAkKG9iaikgaXMgZGVmaW5lZAorSE9TVFNSQ1MgKz0gJChhZGRwcmVmaXggJChTUkNUUkVFKS90b29scy8sJChPQkpfRklMRVMteToubz0uYykpCitCSU5TCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKHNvcnQgJChCSU5fRklMRVMteSkpKQorSE9TVE9CSlMgOj0gJChhZGRwcmVmaXggJChvYmopLCQoT0JKX0ZJTEVTLXkpKQorTk9QRURPQkpTIDo9ICQoYWRkcHJlZml4ICQob2JqKSwkKE5PUEVEX09CSl9GSUxFUy15KSkKKworIworIyBVc2UgbmF0aXZlIHRvb2xzIGFuZCBvcHRpb25zCisjIERlZmluZSBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgdG8gcHJldmVudCB0eXBlZGVmIG92ZXJsYXBzCisjCitIT1NUQ1BQRkxBR1MgPQktaWRpcmFmdGVyICQoU1JDVFJFRSkvaW5jbHVkZSBcCisJCS1pZGlyYWZ0ZXIgJChPQkpUUkVFKS9pbmNsdWRlMiBcCisJCS1pZGlyYWZ0ZXIgJChPQkpUUkVFKS9pbmNsdWRlIFwKKwkgICAgICAgIC1JICQoU1JDVFJFRSkvbGliL2xpYmZkdCBcCisJCS1JICQoU1JDVFJFRSkvdG9vbHMgXAorCQktRFRFWFRfQkFTRT0kKFRFWFRfQkFTRSkgLURVU0VfSE9TVENDIFwKKwkJLURfX0tFUk5FTF9TVFJJQ1RfTkFNRVMKKworCithbGw6CSQob2JqKS5kZXBlbmQgJChCSU5TKSAkKExPR08teSkgc3ViZGlycworCiskKG9iailzaWduR1AkKFNGWCk6CSQob2JqKXNpZ25HUC5vCisJJChIT1NUQ0MpICQoSE9TVENGTEFHUykgJChIT1NUTERGTEFHUykgLW8gJEAgJF4KKwkkKEhPU1RTVFJJUCkgJEAKKworc3ViZGlyczoKK2lmZXEgKCQoVE9PTFNVQkRJUlMpLCkKKwlAOgorZWxzZQorCUBmb3IgZGlyIGluICQoVE9PTFNVQkRJUlMpIDsgZG8gXAorCSAgICAkKE1BS0UpIFwKKwkJSE9TVE9TPSQoSE9TVE9TKSBcCisJCUhPU1RBUkNIPSQoSE9TVEFSQ0gpIFwKKwkJLUMgJCRkaXIgfHwgZXhpdCAxIDsgXAorCWRvbmUKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkZWZpbmVzICQob2JqKS5kZXBlbmQgdGFyZ2V0CitpbmNsdWRlICQoU1JDVFJFRSkvcnVsZXMubWsKKworc2luY2x1ZGUgJChvYmopLmRlcGVuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS94LWxvYWRlci90b29scy9zZXRsb2NhbHZlcnNpb24gYi94LWxvYWRlci90b29scy9zZXRsb2NhbHZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTExZjU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3gtbG9hZGVyL3Rvb2xzL3NldGxvY2FsdmVyc2lvbgpAQCAtMCwwICsxLDQwIEBACisjIS9iaW4vc2gKKyMgUHJpbnQgYWRkaXRpb25hbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciBub24tcmVsZWFzZSB0cmVlcy4KKwordXNhZ2UoKSB7CisJZWNobyAiVXNhZ2U6ICQwIFtzcmN0cmVlXSIgPiYyCisJZXhpdCAxCit9CisKK2NkICIkezE6LS59IiB8fCB1c2FnZQorCisjIENoZWNrIGZvciBnaXQgYW5kIGEgZ2l0IHJlcG8uCitpZiBoZWFkPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGxgOyB0aGVuCisJIyBEbyB3ZSBoYXZlIGFuIHVudGFnZ2VkIHZlcnNpb24/CisJaWYgZ2l0IG5hbWUtcmV2IC0tdGFncyBIRUFEIHwgXAorCSAgIGdyZXAgLUUgJ15IRUFEW1s6c3BhY2U6XV0rKC4qflswLTldKnx1bmRlZmluZWQpJCcgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIChnaXQgZGVzY3JpYmUgfHwgZ2l0IGRlc2NyaWJlIC0tdGFncyB8fCBnaXQgZGVzY3JpYmUgLS1hbGwgLS1sb25nKSBcCisJCQkJMj4vZGV2L251bGwgfCBhd2sgLUYtICd7cHJpbnRmKCItJTA1ZC0lcyIsICQoTkYtMSksJChORikpfScKKwlmaQorCisJIyBBcmUgdGhlcmUgdW5jb21taXR0ZWQgY2hhbmdlcz8KKwlnaXQgdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAtLXVubWVyZ2VkID4gL2Rldi9udWxsCisJaWYgZ2l0IGRpZmYtaW5kZXggLS1uYW1lLW9ubHkgSEVBRCB8IGdyZXAgLXYgIl5zY3JpcHRzL3BhY2thZ2UiIFwKKwkgICAgfCByZWFkIGR1bW15OyB0aGVuCisJCXByaW50ZiAnJXMnIC1kaXJ0eQorCWZpCisKKwkjIElzIHRoaXMgZ2l0IG9uIHN2bj8KKwlpZiBnaXQgY29uZmlnIC0tZ2V0IHN2bi1yZW1vdGUuc3ZuLnVybCA+L2Rldi9udWxsOyB0aGVuCisJCXByaW50ZiAtLSAnLXN2biVzJyAiYGdpdCBzdm4gZmluZC1yZXYgJGhlYWRgIgorCWZpCitmaQorCisjIENoZWNrIGZvciBzdm4gYW5kIGEgc3ZuIHJlcG8uCitpZiByZXY9YHN2biBpbmZvIDI+L2Rldi9udWxsYCA7IHRoZW4KKwlyZXY9YGVjaG8gIiR7cmV2fSIgfCBncmVwICdeUmV2aXNpb24nIHwgYXdrICd7cHJpbnQgJE5GfSdgCisJcHJpbnRmIC0tICctc3ZuJXMnICRyZXYKK2ZpCisKKyMgQ2hlY2sgZm9yIGFueSBsb2NhbHZlcnNpb24tKiBmaWxlcworcHJpbnRmICclcycgImBjYXQgbG9jYWx2ZXJzaW9uLSogMj4vZGV2L251bGxgIgpkaWZmIC0tZ2l0IGEveC1sb2FkZXIvdG9vbHMvc2lnbkdQLmMgYi94LWxvYWRlci90b29scy9zaWduR1AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZThlZDA3Ci0tLSAvZGV2L251bGwKKysrIGIveC1sb2FkZXIvdG9vbHMvc2lnbkdQLmMKQEAgLTAsMCArMSw3MyBAQAorLy8KKy8vIHNpZ25HUC5jCisvLyBSZWFkIHRoZSB4LWxvYWQuYmluIGZpbGUgYW5kIHdyaXRlIG91dCB0aGUgeC1sb2FkLmJpbi5pZnQgZmlsZS4KKy8vIFRoZSBzaWduZWQgaW1hZ2UgaXMgdGhlIG9yaWdpbmFsIHByZS1wZW5kZWQgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UKKy8vIGFuZCB0aGUgbG9hZCBhZGRyZXNzLiAgSWYgbm90IGVudGVyZWQgb24gY29tbWFuZCBsaW5lLCBmaWxlIG5hbWUgaXMKKy8vIGFzc3VtZWQgdG8gYmUgeC1sb2FkLmJpbiBpbiBjdXJyZW50IGRpcmVjdG9yeSBhbmQgbG9hZCBhZGRyZXNzIGlzCisvLyAweDQwMjAwODAwLgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKworbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludAlpOworCWNoYXIJaWZuYW1lW0ZJTEVOQU1FX01BWF0sIG9mbmFtZVtGSUxFTkFNRV9NQVhdLCBjaDsKKwlGSUxFCSppZmlsZSwgKm9maWxlOworCXVuc2lnbmVkIGxvbmcJbG9hZGFkZHIsIGxlbjsKKwlzdHJ1Y3Qgc3RhdAlzaW5mbzsKKworCisJLy8gRGVmYXVsdCB0byB4LWxvYWQuYmluIGFuZCAweDQwMjAwODAwLgorCXN0cmNweShpZm5hbWUsICJ4LWxvYWQuYmluIik7CisJbG9hZGFkZHIgPSAweDQwMjAwODAwOworCisJaWYgKChhcmdjID09IDIpIHx8IChhcmdjID09IDMpKQorCQlzdHJjcHkoaWZuYW1lLCBhcmd2WzFdKTsKKworCWlmIChhcmdjID09IDMpCisJCWxvYWRhZGRyID0gc3RydG9sKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCS8vIEZvcm0gdGhlIG91dHB1dCBmaWxlIG5hbWUuCisJc3RyY3B5KG9mbmFtZSwgaWZuYW1lKTsKKwlzdHJjYXQob2ZuYW1lLCAiLmlmdCIpOworCisJLy8gT3BlbiB0aGUgaW5wdXQgZmlsZS4KKwlpZmlsZSA9IGZvcGVuKGlmbmFtZSwgInJiIik7CisJaWYgKGlmaWxlID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW5ub3Qgb3BlbiAlc1xuIiwgaWZuYW1lKTsKKwkJZXhpdCgwKTsKKwl9CisKKwkvLyBHZXQgZmlsZSBsZW5ndGguCisJc3RhdChpZm5hbWUsICZzaW5mbyk7CisJbGVuID0gc2luZm8uc3Rfc2l6ZTsKKworCS8vIE9wZW4gdGhlIG91dHB1dCBmaWxlIGFuZCB3cml0ZSBpdC4KKwlvZmlsZSA9IGZvcGVuKG9mbmFtZSwgIndiIik7CisJaWYgKG9maWxlID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW5ub3Qgb3BlbiAlc1xuIiwgb2ZuYW1lKTsKKwkJZmNsb3NlKGlmaWxlKTsKKwkJZXhpdCgwKTsKKwl9CisKKwkvLyBQYWQgMSBzZWN0b3Igb2YgemVyb2VzLgorCS8vY2ggPSAweDAwOworCS8vZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKKwkvLwlmd3JpdGUoJmNoLCAxLCAxLCBvZmlsZSk7CisKKwlmd3JpdGUoJmxlbiwgMSwgNCwgb2ZpbGUpOworCWZ3cml0ZSgmbG9hZGFkZHIsIDEsIDQsIG9maWxlKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQlmcmVhZCgmY2gsIDEsIDEsIGlmaWxlKTsKKwkJZndyaXRlKCZjaCwgMSwgMSwgb2ZpbGUpOworCX0KKworCWZjbG9zZShpZmlsZSk7CisJZmNsb3NlKG9maWxlKTsKK30K